{
  "info": {
    "_postman_id": "ab1a84af-ea96-4e75-8c5b-c974119af1b7",
    "name": "CentraPoint API",
    "description": "Create hosted payment links and look up payment status.\n\nGenerated from the CentraPoint OpenAPI specification (API version 1.17.0, https://docs.centrapoint.co.za/openapi.json). Download the latest copy from https://docs.centrapoint.co.za/quickstart#postman.\n\nSetup: set the collection variable `apiKey` to an API key from Settings → API keys in the CentraPoint dashboard (keep it in the Current value so it is not synced or exported). Every request sends it as `Authorization: Bearer {{apiKey}}`. `baseUrl` is the API base URL.\n\nPath variables and bodies hold example values: replace the ids with ones from your own organisation. `Idempotency-Key` headers are included but disabled; enable them to make a POST safe to retry (`{{$guid}}` creates a new key per send).\n\nWebhooks that CentraPoint sends to your endpoints are described at https://docs.centrapoint.co.za/webhooks.",
    "version": "1.17.0",
    "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://app.centrapoint.co.za",
      "type": "string",
      "description": "CentraPoint API base URL."
    },
    {
      "key": "apiKey",
      "value": "",
      "type": "string",
      "description": "Your CentraPoint API key (cp_xxxxxxxx_...). Set it in the Current value; never commit or share it."
    }
  ],
  "item": [
    {
      "name": "Account",
      "description": "The calling API key's organisation, plan and entitlements.\n\nDocs: https://docs.centrapoint.co.za/entitlements",
      "item": [
        {
          "name": "Get your organisation and entitlements",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/me",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "me"
              ]
            },
            "description": "The calling API key's organisation, plan and full entitlements: built-in feature flags and limits (with per-organisation overrides applied) plus custom features. Use it in your own apps to decide what to enable.\n\nReference: https://docs.centrapoint.co.za/reference#getMe"
          },
          "response": [
            {
              "name": "200 Organisation, plan, entitlements and key",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/me",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "me"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"tenant\": {\n    \"id\": \"cmg0t1n2t0001ten0001abcd\",\n    \"name\": \"Acme (Pty) Ltd\",\n    \"slug\": \"acme\",\n    \"accountNumber\": \"CP100042\",\n    \"status\": \"active\",\n    \"kind\": \"customer\",\n    \"billingCycle\": \"monthly\",\n    \"trialEndsAt\": null,\n    \"currentPeriodEnd\": \"2026-10-31T21:59:59.000Z\"\n  },\n  \"plan\": {\n    \"code\": \"business\",\n    \"name\": \"Business\"\n  },\n  \"compliance\": {\n    \"status\": \"approved\",\n    \"approved\": true\n  },\n  \"entitlements\": {\n    \"features\": {\n      \"featInvoicing\": true,\n      \"featPaymentLinks\": true,\n      \"featRecurring\": true,\n      \"featDebitOrders\": true,\n      \"featApi\": true,\n      \"featReports\": true,\n      \"featCustomerPortal\": true,\n      \"featCoupons\": true\n    },\n    \"limits\": {\n      \"maxUsers\": 10,\n      \"maxProviders\": null,\n      \"maxCustomers\": null,\n      \"maxMonthlyTransactions\": null,\n      \"maxApiKeys\": 5,\n      \"maxMandates\": 500\n    },\n    \"custom\": {\n      \"sms_notifications\": {\n        \"enabled\": true,\n        \"limit\": 1000,\n        \"label\": \"SMS notifications\"\n      }\n    }\n  },\n  \"apiKey\": {\n    \"name\": \"Production\",\n    \"prefix\": \"cp_1a2b3c4d\",\n    \"createdAt\": \"2026-09-01T10:00:00.000Z\"\n  }\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/me",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "me"
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Check one entitlement",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/entitlements/:key",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "entitlements",
                ":key"
              ],
              "variable": [
                {
                  "key": "key",
                  "value": "featRecurring"
                }
              ]
            },
            "description": "Whether your organisation has a feature. `key` is a built-in flag (e.g. `featRecurring`), a built-in limit (e.g. `maxUsers`) or a custom feature key (e.g. `sms_notifications`). Any valid API key may call this, even when the plan has no REST API.\n\nReference: https://docs.centrapoint.co.za/reference#getEntitlement"
          },
          "response": [
            {
              "name": "200 The entitlement",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/entitlements/:key",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "entitlements",
                    ":key"
                  ],
                  "variable": [
                    {
                      "key": "key",
                      "value": "featRecurring"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"key\": \"featRecurring\",\n  \"enabled\": true,\n  \"limit\": null\n}"
            },
            {
              "name": "404 Unknown key",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/entitlements/:key",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "entitlements",
                    ":key"
                  ],
                  "variable": [
                    {
                      "key": "key",
                      "value": "featRecurring"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Feature not found\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Customers",
      "description": "Your customers, keyed by your own externalReference.\n\nDocs: https://docs.centrapoint.co.za/customers",
      "item": [
        {
          "name": "List customers",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customers",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customers"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "nkosi trading",
                  "description": "Search (up to 100 characters): every word must appear (case-insensitive) in the first or last name, company, email, billing email, accountCode or externalReference.",
                  "disabled": true
                },
                {
                  "key": "externalReference",
                  "value": "",
                  "description": "Exact match on your customer ID.",
                  "disabled": true
                },
                {
                  "key": "email",
                  "value": "",
                  "description": "Exact match (case-insensitive).",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ]
            },
            "description": "Newest first, keyset paginated (`limit`, `startingAfter`; the response has `hasMore` and `nextCursor`). Filters combine.\n\nReference: https://docs.centrapoint.co.za/reference#listCustomers"
          },
          "response": [
            {
              "name": "200 Customers",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers"
                  ],
                  "query": [
                    {
                      "key": "q",
                      "value": "nkosi trading",
                      "description": "Search (up to 100 characters): every word must appear (case-insensitive) in the first or last name, company, email, billing email, accountCode or externalReference.",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "Exact match on your customer ID.",
                      "disabled": true
                    },
                    {
                      "key": "email",
                      "value": "",
                      "description": "Exact match (case-insensitive).",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg2c0s7t0003cust0001abcd\",\n      \"accountCode\": \"CUS-00042\",\n      \"externalReference\": \"CRM-1001\",\n      \"email\": \"thandi@example.co.za\",\n      \"firstName\": \"Thandi\",\n      \"lastName\": \"Nkosi\",\n      \"company\": \"Nkosi Trading (Pty) Ltd\",\n      \"vatNumber\": \"4123456789\",\n      \"phone\": \"+27821234567\",\n      \"address\": \"12 Long Street, Cape Town, 8001\",\n      \"active\": true,\n      \"metadata\": {\n        \"crmId\": \"0061x00000AbCdE\"\n      },\n      \"createdAt\": \"2026-09-25T08:00:00.000Z\",\n      \"updatedAt\": \"2026-09-25T08:00:00.000Z\"\n    }\n  ],\n  \"hasMore\": false,\n  \"nextCursor\": null\n}"
            },
            {
              "name": "400 `q` longer than 100 characters, or `startingAfter` is not an id from this list",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers"
                  ],
                  "query": [
                    {
                      "key": "q",
                      "value": "nkosi trading",
                      "description": "Search (up to 100 characters): every word must appear (case-insensitive) in the first or last name, company, email, billing email, accountCode or externalReference.",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "Exact match on your customer ID.",
                      "disabled": true
                    },
                    {
                      "key": "email",
                      "value": "",
                      "description": "Exact match (case-insensitive).",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"startingAfter is not a valid id\"\n}"
            },
            {
              "name": "403 API access (or the feature) is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers"
                  ],
                  "query": [
                    {
                      "key": "q",
                      "value": "nkosi trading",
                      "description": "Search (up to 100 characters): every word must appear (case-insensitive) in the first or last name, company, email, billing email, accountCode or externalReference.",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "Exact match on your customer ID.",
                      "disabled": true
                    },
                    {
                      "key": "email",
                      "value": "",
                      "description": "Exact match (case-insensitive).",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers"
                  ],
                  "query": [
                    {
                      "key": "q",
                      "value": "nkosi trading",
                      "description": "Search (up to 100 characters): every word must appear (case-insensitive) in the first or last name, company, email, billing email, accountCode or externalReference.",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "Exact match on your customer ID.",
                      "disabled": true
                    },
                    {
                      "key": "email",
                      "value": "",
                      "description": "Exact match (case-insensitive).",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Create or upsert a customer",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customers",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customers"
              ]
            },
            "description": "Without `externalReference`: creates a customer (201). With `externalReference`: upsert keyed on it — updates the customer with that reference (200), otherwise adopts an existing customer with the same email and no reference (200), otherwise creates one (201). Available on any plan with API access; creating counts towards your customer limit.\n\nReference: https://docs.centrapoint.co.za/reference#createCustomer",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"externalReference\": \"CRM-1001\",\n  \"email\": \"thandi@example.co.za\",\n  \"firstName\": \"Thandi\",\n  \"lastName\": \"Nkosi\",\n  \"company\": \"Nkosi Trading (Pty) Ltd\",\n  \"vatNumber\": \"4123456789\",\n  \"phone\": \"+27821234567\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 Existing customer updated (upsert)",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"externalReference\": \"CRM-1001\",\n  \"email\": \"thandi@example.co.za\",\n  \"firstName\": \"Thandi\",\n  \"lastName\": \"Nkosi\",\n  \"company\": \"Nkosi Trading (Pty) Ltd\",\n  \"vatNumber\": \"4123456789\",\n  \"phone\": \"+27821234567\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2c0s7t0003cust0001abcd\",\n  \"accountCode\": \"CUS-00042\",\n  \"externalReference\": \"CRM-1001\",\n  \"contactType\": \"company\",\n  \"email\": \"thandi@example.co.za\",\n  \"billingEmail\": \"accounts@nkosi.example.co.za\",\n  \"firstName\": \"Thandi\",\n  \"lastName\": \"Nkosi\",\n  \"company\": \"Nkosi Trading (Pty) Ltd\",\n  \"vatNumber\": \"4123456789\",\n  \"phone\": \"+27821234567\",\n  \"address\": \"12 Long Street, Cape Town, 8001\",\n  \"active\": true,\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"createdAt\": \"2026-09-25T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-25T08:00:00.000Z\"\n}"
            },
            {
              "name": "201 Customer created",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"externalReference\": \"CRM-1001\",\n  \"email\": \"thandi@example.co.za\",\n  \"firstName\": \"Thandi\",\n  \"lastName\": \"Nkosi\",\n  \"company\": \"Nkosi Trading (Pty) Ltd\",\n  \"vatNumber\": \"4123456789\",\n  \"phone\": \"+27821234567\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2c0s7t0003cust0001abcd\",\n  \"accountCode\": \"CUS-00042\",\n  \"externalReference\": \"CRM-1001\",\n  \"contactType\": \"company\",\n  \"email\": \"thandi@example.co.za\",\n  \"billingEmail\": \"accounts@nkosi.example.co.za\",\n  \"firstName\": \"Thandi\",\n  \"lastName\": \"Nkosi\",\n  \"company\": \"Nkosi Trading (Pty) Ltd\",\n  \"vatNumber\": \"4123456789\",\n  \"phone\": \"+27821234567\",\n  \"address\": \"12 Long Street, Cape Town, 8001\",\n  \"active\": true,\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"createdAt\": \"2026-09-25T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-25T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed or invalid metadata",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"externalReference\": \"CRM-1001\",\n  \"email\": \"thandi@example.co.za\",\n  \"firstName\": \"Thandi\",\n  \"lastName\": \"Nkosi\",\n  \"company\": \"Nkosi Trading (Pty) Ltd\",\n  \"vatNumber\": \"4123456789\",\n  \"phone\": \"+27821234567\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Invalid body\",\n  \"issues\": [\n    {\n      \"code\": \"invalid_format\",\n      \"format\": \"email\",\n      \"path\": [\n        \"email\"\n      ],\n      \"message\": \"Invalid email address\"\n    }\n  ]\n}"
            },
            {
              "name": "403 Plan does not include the API, customer limit reached (`plan_limit`), or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"externalReference\": \"CRM-1001\",\n  \"email\": \"thandi@example.co.za\",\n  \"firstName\": \"Thandi\",\n  \"lastName\": \"Nkosi\",\n  \"company\": \"Nkosi Trading (Pty) Ltd\",\n  \"vatNumber\": \"4123456789\",\n  \"phone\": \"+27821234567\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_limit\",\n  \"message\": \"Customers limit reached (2000/2000) on the Growth plan. Upgrade under Settings > Billing.\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"externalReference\": \"CRM-1001\",\n  \"email\": \"thandi@example.co.za\",\n  \"firstName\": \"Thandi\",\n  \"lastName\": \"Nkosi\",\n  \"company\": \"Nkosi Trading (Pty) Ltd\",\n  \"vatNumber\": \"4123456789\",\n  \"phone\": \"+27821234567\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"externalReference\": \"CRM-1001\",\n  \"email\": \"thandi@example.co.za\",\n  \"firstName\": \"Thandi\",\n  \"lastName\": \"Nkosi\",\n  \"company\": \"Nkosi Trading (Pty) Ltd\",\n  \"vatNumber\": \"4123456789\",\n  \"phone\": \"+27821234567\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Look up a customer",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customers/lookup",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customers",
                "lookup"
              ],
              "query": [
                {
                  "key": "email",
                  "value": "thandi@example.co.za",
                  "description": "Exact match, case-insensitive (up to 200 characters).",
                  "disabled": true
                },
                {
                  "key": "externalReference",
                  "value": "",
                  "description": "Exact match (up to 190 characters).",
                  "disabled": true
                },
                {
                  "key": "accountCode",
                  "value": "",
                  "description": "Exact match, e.g. `CUS-00042` (up to 50 characters).",
                  "disabled": true
                }
              ]
            },
            "description": "Exact match on exactly one of `email`, `externalReference` or `accountCode`. Returns the customer, or 404. When several customers share an email, the oldest is returned.\n\nReference: https://docs.centrapoint.co.za/reference#lookupCustomer"
          },
          "response": [
            {
              "name": "200 The customer",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/lookup",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    "lookup"
                  ],
                  "query": [
                    {
                      "key": "email",
                      "value": "thandi@example.co.za",
                      "description": "Exact match, case-insensitive (up to 200 characters).",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "Exact match (up to 190 characters).",
                      "disabled": true
                    },
                    {
                      "key": "accountCode",
                      "value": "",
                      "description": "Exact match, e.g. `CUS-00042` (up to 50 characters).",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2c0s7t0003cust0001abcd\",\n  \"accountCode\": \"CUS-00042\",\n  \"externalReference\": \"CRM-1001\",\n  \"contactType\": \"company\",\n  \"email\": \"thandi@example.co.za\",\n  \"billingEmail\": \"accounts@nkosi.example.co.za\",\n  \"firstName\": \"Thandi\",\n  \"lastName\": \"Nkosi\",\n  \"company\": \"Nkosi Trading (Pty) Ltd\",\n  \"vatNumber\": \"4123456789\",\n  \"phone\": \"+27821234567\",\n  \"address\": \"12 Long Street, Cape Town, 8001\",\n  \"active\": true,\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"createdAt\": \"2026-09-25T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-25T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 None or more than one lookup key, or a value too long",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/lookup",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    "lookup"
                  ],
                  "query": [
                    {
                      "key": "email",
                      "value": "thandi@example.co.za",
                      "description": "Exact match, case-insensitive (up to 200 characters).",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "Exact match (up to 190 characters).",
                      "disabled": true
                    },
                    {
                      "key": "accountCode",
                      "value": "",
                      "description": "Exact match, e.g. `CUS-00042` (up to 50 characters).",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Provide exactly one of email, externalReference or accountCode\"\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/lookup",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    "lookup"
                  ],
                  "query": [
                    {
                      "key": "email",
                      "value": "thandi@example.co.za",
                      "description": "Exact match, case-insensitive (up to 200 characters).",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "Exact match (up to 190 characters).",
                      "disabled": true
                    },
                    {
                      "key": "accountCode",
                      "value": "",
                      "description": "Exact match, e.g. `CUS-00042` (up to 50 characters).",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            },
            {
              "name": "404 No matching customer",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/lookup",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    "lookup"
                  ],
                  "query": [
                    {
                      "key": "email",
                      "value": "thandi@example.co.za",
                      "description": "Exact match, case-insensitive (up to 200 characters).",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "Exact match (up to 190 characters).",
                      "disabled": true
                    },
                    {
                      "key": "accountCode",
                      "value": "",
                      "description": "Exact match, e.g. `CUS-00042` (up to 50 characters).",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Customer not found\"\n}"
            }
          ]
        },
        {
          "name": "Get a customer",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customers/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customers",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2c0s7t0003cust0001abcd"
                }
              ]
            },
            "description": "Reference: https://docs.centrapoint.co.za/reference#getCustomer"
          },
          "response": [
            {
              "name": "200 The customer",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2c0s7t0003cust0001abcd\",\n  \"accountCode\": \"CUS-00042\",\n  \"externalReference\": \"CRM-1001\",\n  \"contactType\": \"company\",\n  \"email\": \"thandi@example.co.za\",\n  \"billingEmail\": \"accounts@nkosi.example.co.za\",\n  \"firstName\": \"Thandi\",\n  \"lastName\": \"Nkosi\",\n  \"company\": \"Nkosi Trading (Pty) Ltd\",\n  \"vatNumber\": \"4123456789\",\n  \"phone\": \"+27821234567\",\n  \"address\": \"12 Long Street, Cape Town, 8001\",\n  \"active\": true,\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"createdAt\": \"2026-09-25T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-25T08:00:00.000Z\"\n}"
            },
            {
              "name": "403 API access (or the feature) is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No customer with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Customer not found\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Update a customer",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customers/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customers",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2c0s7t0003cust0001abcd"
                }
              ]
            },
            "description": "Partial update. Omitted fields are unchanged; `null` clears optional fields; `metadata` replaces the whole map. Unknown fields are rejected. Idempotency-Key is not used (PATCH is naturally repeatable).\n\nReference: https://docs.centrapoint.co.za/reference#updateCustomer",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"phone\": \"+27829876543\",\n  \"company\": null,\n  \"active\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 Updated customer",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+27829876543\",\n  \"company\": null,\n  \"active\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2c0s7t0003cust0001abcd\",\n  \"accountCode\": \"CUS-00042\",\n  \"externalReference\": \"CRM-1001\",\n  \"contactType\": \"company\",\n  \"email\": \"thandi@example.co.za\",\n  \"billingEmail\": \"accounts@nkosi.example.co.za\",\n  \"firstName\": \"Thandi\",\n  \"lastName\": \"Nkosi\",\n  \"company\": \"Nkosi Trading (Pty) Ltd\",\n  \"vatNumber\": \"4123456789\",\n  \"phone\": \"+27821234567\",\n  \"address\": \"12 Long Street, Cape Town, 8001\",\n  \"active\": true,\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"createdAt\": \"2026-09-25T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-25T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed, unknown field, or externalReference used by another customer",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+27829876543\",\n  \"company\": null,\n  \"active\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Another customer already has that externalReference\"\n}"
            },
            {
              "name": "403 Account is read-only (suspended, cancelled or trial ended), or a plan feature/quota is missing",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+27829876543\",\n  \"company\": null,\n  \"active\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No customer with this ID in your organisation",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+27829876543\",\n  \"company\": null,\n  \"active\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Customer not found\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+27829876543\",\n  \"company\": null,\n  \"active\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Send a customer portal link, or create a sign-in link",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customers/:id/portal-link",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customers",
                ":id",
                "portal-link"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2c0s7t0003cust0001abcd"
                }
              ]
            },
            "description": "Default (no body, `{}` or `{ \"email\": true }`): emails the customer the portal sign-in page and returns its URL (`sent: true`). `{ \"email\": false, \"expiresInMinutes\"?, \"section\"? }`: sends nothing and returns a single-use sign-in URL (`sent: false`, `expiresAt`) that signs the customer straight in to the portal, valid 15 minutes by default (at most 1440). Create it when your signed-in user clicks through and redirect them; treat it as a secret. Not idempotent (the Idempotency-Key header is ignored).\n\nReference: https://docs.centrapoint.co.za/reference#sendCustomerPortalLink",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": false,\n  \"expiresInMinutes\": 10,\n  \"section\": \"invoices\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 Emailed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id/portal-link",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id",
                    "portal-link"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": false,\n  \"expiresInMinutes\": 10,\n  \"section\": \"invoices\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"portal_link\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"url\": \"https://app.centrapoint.co.za/portal/acme\",\n  \"sent\": true\n}"
            },
            {
              "name": "200 Sign-in link (email: false)",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id/portal-link",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id",
                    "portal-link"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": false,\n  \"expiresInMinutes\": 10,\n  \"section\": \"invoices\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"portal_link\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"url\": \"https://app.centrapoint.co.za/api/portal/auth/acme/link?token=q3Jx…&next=invoices\",\n  \"sent\": false,\n  \"expiresAt\": \"2026-10-01T08:10:00.000Z\"\n}"
            },
            {
              "name": "400 Unknown fields, or `expiresInMinutes` / `section` without `email: false`",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id/portal-link",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id",
                    "portal-link"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": false,\n  \"expiresInMinutes\": 10,\n  \"section\": \"invoices\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Invalid body\"\n}"
            },
            {
              "name": "403 No API access, plan feature missing, or the account is read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id/portal-link",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id",
                    "portal-link"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": false,\n  \"expiresInMinutes\": 10,\n  \"section\": \"invoices\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No customer with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id/portal-link",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id",
                    "portal-link"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": false,\n  \"expiresInMinutes\": 10,\n  \"section\": \"invoices\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Customer not found\"\n}"
            },
            {
              "name": "409 The customer portal is not enabled (Settings → Customer portal) or not in your plan",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id/portal-link",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id",
                    "portal-link"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": false,\n  \"expiresInMinutes\": 10,\n  \"section\": \"invoices\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"portal_disabled\",\n  \"message\": \"The customer portal is not enabled. Turn it on under Settings > Customer portal.\"\n}"
            },
            {
              "name": "422 Email not sent",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id/portal-link",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id",
                    "portal-link"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": false,\n  \"expiresInMinutes\": 10,\n  \"section\": \"invoices\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_sent\",\n  \"message\": \"The customer is inactive and cannot sign in to the portal.\",\n  \"url\": \"https://app.centrapoint.co.za/portal/acme\"\n}"
            },
            {
              "name": "422 Sign-in link for an inactive customer",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customers/:id/portal-link",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customers",
                    ":id",
                    "portal-link"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2c0s7t0003cust0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": false,\n  \"expiresInMinutes\": 10,\n  \"section\": \"invoices\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"customer_inactive\",\n  \"message\": \"The customer is inactive and cannot sign in to the portal.\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Products",
      "description": "Your product catalogue.\n\nDocs: https://docs.centrapoint.co.za/products",
      "item": [
        {
          "name": "List products",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/products",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "products"
              ],
              "query": [
                {
                  "key": "enabled",
                  "value": "",
                  "description": "Only enabled (`true`) or disabled (`false`) products.",
                  "disabled": true
                },
                {
                  "key": "billingType",
                  "value": "",
                  "description": "Filter by billing type.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                }
              ]
            },
            "description": "Your product catalogue in name order.\n\nReference: https://docs.centrapoint.co.za/reference#listProducts"
          },
          "response": [
            {
              "name": "200 Products",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products"
                  ],
                  "query": [
                    {
                      "key": "enabled",
                      "value": "",
                      "description": "Only enabled (`true`) or disabled (`false`) products.",
                      "disabled": true
                    },
                    {
                      "key": "billingType",
                      "value": "",
                      "description": "Filter by billing type.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg4r7q6p0004prd0001abcd\",\n      \"object\": \"product\",\n      \"sku\": \"SUP-HR\",\n      \"name\": \"Support hour\",\n      \"description\": \"One hour of remote support\",\n      \"amount\": 650,\n      \"currency\": \"ZAR\",\n      \"billingType\": \"once\",\n      \"frequency\": null,\n      \"taxable\": true,\n      \"enabled\": true,\n      \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n      \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n    }\n  ]\n}"
            },
            {
              "name": "400 Invalid billingType",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products"
                  ],
                  "query": [
                    {
                      "key": "enabled",
                      "value": "",
                      "description": "Only enabled (`true`) or disabled (`false`) products.",
                      "disabled": true
                    },
                    {
                      "key": "billingType",
                      "value": "",
                      "description": "Filter by billing type.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"billingType must be once or recurring\"\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products"
                  ],
                  "query": [
                    {
                      "key": "enabled",
                      "value": "",
                      "description": "Only enabled (`true`) or disabled (`false`) products.",
                      "disabled": true
                    },
                    {
                      "key": "billingType",
                      "value": "",
                      "description": "Filter by billing type.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Create a product",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/products",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "products"
              ]
            },
            "description": "Creates a catalogue product. Recurring products need a `frequency` and a plan with Recurring billing.\n\nReference: https://docs.centrapoint.co.za/reference#createProduct",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sku\": \"SUP-HR\",\n  \"name\": \"Support hour\",\n  \"description\": \"One hour of remote support\",\n  \"amount\": 650\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 The new product",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"sku\": \"SUP-HR\",\n  \"name\": \"Support hour\",\n  \"description\": \"One hour of remote support\",\n  \"amount\": 650\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4r7q6p0004prd0001abcd\",\n  \"object\": \"product\",\n  \"sku\": \"SUP-HR\",\n  \"name\": \"Support hour\",\n  \"description\": \"One hour of remote support\",\n  \"amount\": 650,\n  \"currency\": \"ZAR\",\n  \"billingType\": \"once\",\n  \"frequency\": null,\n  \"taxable\": true,\n  \"enabled\": true,\n  \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed (e",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"sku\": \"SUP-HR\",\n  \"name\": \"Support hour\",\n  \"description\": \"One hour of remote support\",\n  \"amount\": 650\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Recurring products need a frequency\"\n}"
            },
            {
              "name": "403 No API access, plan feature missing, or the account is read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"sku\": \"SUP-HR\",\n  \"name\": \"Support hour\",\n  \"description\": \"One hour of remote support\",\n  \"amount\": 650\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "409 Idempotency-Key reused with a different body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"sku\": \"SUP-HR\",\n  \"name\": \"Support hour\",\n  \"description\": \"One hour of remote support\",\n  \"amount\": 650\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Get a product",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/products/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "products",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4r7q6p0004prd0001abcd"
                }
              ]
            },
            "description": "Reference: https://docs.centrapoint.co.za/reference#getProduct"
          },
          "response": [
            {
              "name": "200 The product",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4r7q6p0004prd0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4r7q6p0004prd0001abcd\",\n  \"object\": \"product\",\n  \"sku\": \"SUP-HR\",\n  \"name\": \"Support hour\",\n  \"description\": \"One hour of remote support\",\n  \"amount\": 650,\n  \"currency\": \"ZAR\",\n  \"billingType\": \"once\",\n  \"frequency\": null,\n  \"taxable\": true,\n  \"enabled\": true,\n  \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4r7q6p0004prd0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            },
            {
              "name": "404 No product with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4r7q6p0004prd0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Product not found\"\n}"
            }
          ]
        },
        {
          "name": "Update a product",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/products/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "products",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4r7q6p0004prd0001abcd"
                }
              ]
            },
            "description": "Partial update; `null` clears sku/description. Switching to `billingType: \"recurring\"` needs a frequency and Recurring billing; switching to `once` clears the frequency. Idempotency-Key is not used.\n\nReference: https://docs.centrapoint.co.za/reference#updateProduct",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 700,\n  \"enabled\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 The updated product",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4r7q6p0004prd0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 700,\n  \"enabled\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4r7q6p0004prd0001abcd\",\n  \"object\": \"product\",\n  \"sku\": \"SUP-HR\",\n  \"name\": \"Support hour\",\n  \"description\": \"One hour of remote support\",\n  \"amount\": 700,\n  \"currency\": \"ZAR\",\n  \"billingType\": \"once\",\n  \"frequency\": null,\n  \"taxable\": true,\n  \"enabled\": true,\n  \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4r7q6p0004prd0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 700,\n  \"enabled\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Recurring products need a frequency\"\n}"
            },
            {
              "name": "403 No API access, plan feature missing, or the account is read-only",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4r7q6p0004prd0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 700,\n  \"enabled\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No product with this ID in your organisation",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/products/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "products",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4r7q6p0004prd0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 700,\n  \"enabled\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Product not found\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Invoices",
      "description": "Invoices with VAT, pay links and offline payments.\n\nDocs: https://docs.centrapoint.co.za/invoices",
      "item": [
        {
          "name": "List invoices",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/invoices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "invoices"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "sent,overdue,partially_paid",
                  "description": "One or more comma-separated statuses: `draft`, `sent`, `overdue`, `partially_paid`, `paid`, `cancelled`. `draft`/`sent`/`overdue` exclude invoices that have received money; `partially_paid` is open invoices with money received. Example: `sent,overdue,partially_paid`.",
                  "disabled": true
                },
                {
                  "key": "number",
                  "value": "",
                  "description": "Exact invoice number, e.g. `INV-000042`.",
                  "disabled": true
                },
                {
                  "key": "customerId",
                  "value": "",
                  "description": "Filter by customer.",
                  "disabled": true
                },
                {
                  "key": "customerExternalReference",
                  "value": "",
                  "description": "Filter by the customer's externalReference.",
                  "disabled": true
                },
                {
                  "key": "externalReference",
                  "value": "",
                  "description": "The invoice's externalReference (exact match).",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "",
                  "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the issue date.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "End date (YYYY-MM-DD, SAST, inclusive) on the issue date.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ]
            },
            "description": "Newest first, with keyset pagination (`limit`, `startingAfter`; the response is `{ data, hasMore, nextCursor }`). `status=draft|sent|overdue` returns only invoices with nothing paid; use `partially_paid` for open invoices with part payments. Several statuses can be combined, comma-separated. Each invoice includes its `payments`.\n\nReference: https://docs.centrapoint.co.za/reference#listInvoices"
          },
          "response": [
            {
              "name": "200 A page of invoices",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "sent,overdue,partially_paid",
                      "description": "One or more comma-separated statuses: `draft`, `sent`, `overdue`, `partially_paid`, `paid`, `cancelled`. `draft`/`sent`/`overdue` exclude invoices that have received money; `partially_paid` is open invoices with money received. Example: `sent,overdue,partially_paid`.",
                      "disabled": true
                    },
                    {
                      "key": "number",
                      "value": "",
                      "description": "Exact invoice number, e.g. `INV-000042`.",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "customerExternalReference",
                      "value": "",
                      "description": "Filter by the customer's externalReference.",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "The invoice's externalReference (exact match).",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the issue date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the issue date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg2i9n0v0005inv0001abcd\",\n      \"number\": \"INV-000042\",\n      \"status\": \"sent\",\n      \"externalReference\": \"ORDER-1001\",\n      \"customer\": {\n        \"id\": \"cmg2c0s7t0003cust0001abcd\",\n        \"externalReference\": \"CRM-1001\",\n        \"email\": \"thandi@example.co.za\"\n      },\n      \"currency\": \"ZAR\",\n      \"issueDate\": \"2026-09-24T22:00:00.000Z\",\n      \"dueDate\": \"2026-10-08T21:59:59.000Z\",\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2026-10-31\",\n      \"lines\": [\n        {\n          \"description\": \"Website hosting - October\",\n          \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n          \"quantity\": 1,\n          \"unitPrice\": 434.78,\n          \"taxRate\": 15,\n          \"amount\": 434.78,\n          \"periodStart\": null,\n          \"periodEnd\": null\n        },\n        {\n          \"description\": \"Domain renewal (zero-rated)\",\n          \"details\": null,\n          \"quantity\": 1,\n          \"unitPrice\": 120,\n          \"taxRate\": 0,\n          \"amount\": 120,\n          \"periodStart\": \"2026-10-01\",\n          \"periodEnd\": \"2027-09-30\"\n        }\n      ],\n      \"taxInclusive\": false,\n      \"subtotal\": 554.78,\n      \"taxAmount\": 65.22,\n      \"total\": 620,\n      \"amountPaid\": 0,\n      \"amountDue\": 620,\n      \"paidAt\": null,\n      \"payments\": [],\n      \"payUrl\": \"https://app.centrapoint.co.za/pay/Xb7kP2qR9sLm4TvWz8Yc\",\n      \"notes\": \"Payment due within 14 days.\",\n      \"metadata\": {\n        \"crmId\": \"0061x00000AbCdE\"\n      },\n      \"createdAt\": \"2026-09-25T08:05:00.000Z\",\n      \"updatedAt\": \"2026-09-25T08:05:00.000Z\"\n    }\n  ],\n  \"hasMore\": false,\n  \"nextCursor\": null\n}"
            },
            {
              "name": "400 Invalid status, bad date format or unknown `startingAfter`",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "sent,overdue,partially_paid",
                      "description": "One or more comma-separated statuses: `draft`, `sent`, `overdue`, `partially_paid`, `paid`, `cancelled`. `draft`/`sent`/`overdue` exclude invoices that have received money; `partially_paid` is open invoices with money received. Example: `sent,overdue,partially_paid`.",
                      "disabled": true
                    },
                    {
                      "key": "number",
                      "value": "",
                      "description": "Exact invoice number, e.g. `INV-000042`.",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "customerExternalReference",
                      "value": "",
                      "description": "Filter by the customer's externalReference.",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "The invoice's externalReference (exact match).",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the issue date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the issue date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"status must be one or more (comma-separated) of draft, sent, overdue, paid, cancelled, partially_paid\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "sent,overdue,partially_paid",
                      "description": "One or more comma-separated statuses: `draft`, `sent`, `overdue`, `partially_paid`, `paid`, `cancelled`. `draft`/`sent`/`overdue` exclude invoices that have received money; `partially_paid` is open invoices with money received. Example: `sent,overdue,partially_paid`.",
                      "disabled": true
                    },
                    {
                      "key": "number",
                      "value": "",
                      "description": "Exact invoice number, e.g. `INV-000042`.",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "customerExternalReference",
                      "value": "",
                      "description": "Filter by the customer's externalReference.",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "The invoice's externalReference (exact match).",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the issue date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the issue date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "sent,overdue,partially_paid",
                      "description": "One or more comma-separated statuses: `draft`, `sent`, `overdue`, `partially_paid`, `paid`, `cancelled`. `draft`/`sent`/`overdue` exclude invoices that have received money; `partially_paid` is open invoices with money received. Example: `sent,overdue,partially_paid`.",
                      "disabled": true
                    },
                    {
                      "key": "number",
                      "value": "",
                      "description": "Exact invoice number, e.g. `INV-000042`.",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "customerExternalReference",
                      "value": "",
                      "description": "Filter by the customer's externalReference.",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "The invoice's externalReference (exact match).",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the issue date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the issue date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Create an invoice",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/invoices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "invoices"
              ]
            },
            "description": "Creates an invoice with per-line VAT (201). If `externalReference` matches an existing invoice, that invoice is returned unchanged with 200 (the body is not applied and it is not re-sent). A pay link for the balance is created when your plan includes payment links and a gateway accepts the currency. Invoices are drafts by default. `status: \"sent\"` (or `issue: true`) creates the invoice issued without an email; `send: true` issues it and emails it. `invoice.sent` is sent either way. Requires the Invoicing feature.\n\nReference: https://docs.centrapoint.co.za/reference#createInvoice",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"externalReference\": \"ORDER-1001\",\n  \"dueDate\": \"2026-10-08\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"send\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 An invoice with this externalReference already existed; returned unchanged",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"externalReference\": \"ORDER-1001\",\n  \"dueDate\": \"2026-10-08\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"send\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2i9n0v0005inv0001abcd\",\n  \"number\": \"INV-000042\",\n  \"status\": \"sent\",\n  \"externalReference\": \"ORDER-1001\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"currency\": \"ZAR\",\n  \"issueDate\": \"2026-09-24T22:00:00.000Z\",\n  \"dueDate\": \"2026-10-08T21:59:59.000Z\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78,\n      \"taxRate\": 15,\n      \"amount\": 434.78,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"amount\": 120,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"taxInclusive\": false,\n  \"subtotal\": 554.78,\n  \"taxAmount\": 65.22,\n  \"total\": 620,\n  \"amountPaid\": 0,\n  \"amountDue\": 620,\n  \"paidAt\": null,\n  \"payments\": [],\n  \"payUrl\": \"https://app.centrapoint.co.za/pay/Xb7kP2qR9sLm4TvWz8Yc\",\n  \"notes\": \"Payment due within 14 days.\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"createdAt\": \"2026-09-25T08:05:00.000Z\",\n  \"updatedAt\": \"2026-09-25T08:05:00.000Z\"\n}"
            },
            {
              "name": "201 Invoice created",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"externalReference\": \"ORDER-1001\",\n  \"dueDate\": \"2026-10-08\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"send\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2i9n0v0005inv0001abcd\",\n  \"number\": \"INV-000042\",\n  \"status\": \"sent\",\n  \"externalReference\": \"ORDER-1001\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"currency\": \"ZAR\",\n  \"issueDate\": \"2026-09-24T22:00:00.000Z\",\n  \"dueDate\": \"2026-10-08T21:59:59.000Z\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78,\n      \"taxRate\": 15,\n      \"amount\": 434.78,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"amount\": 120,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"taxInclusive\": false,\n  \"subtotal\": 554.78,\n  \"taxAmount\": 65.22,\n  \"total\": 620,\n  \"amountPaid\": 0,\n  \"amountDue\": 620,\n  \"paidAt\": null,\n  \"payments\": [],\n  \"payUrl\": \"https://app.centrapoint.co.za/pay/Xb7kP2qR9sLm4TvWz8Yc\",\n  \"notes\": \"Payment due within 14 days.\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"createdAt\": \"2026-09-25T08:05:00.000Z\",\n  \"updatedAt\": \"2026-09-25T08:05:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed, invalid ISO 4217 currency, customer not found, or totals invalid",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"externalReference\": \"ORDER-1001\",\n  \"dueDate\": \"2026-10-08\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"send\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Customer not found\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"externalReference\": \"ORDER-1001\",\n  \"dueDate\": \"2026-10-08\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"send\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"externalReference\": \"ORDER-1001\",\n  \"dueDate\": \"2026-10-08\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"send\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"externalReference\": \"ORDER-1001\",\n  \"dueDate\": \"2026-10-08\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"send\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Get an invoice",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/invoices/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "invoices",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2i9n0v0005inv0001abcd",
                  "description": "Invoice ID or invoice number (e.g. INV-000042)."
                }
              ]
            },
            "description": "By ID or invoice number. Includes `payments`: offline payments and completed transactions linked to the invoice.\n\nReference: https://docs.centrapoint.co.za/reference#getInvoice"
          },
          "response": [
            {
              "name": "200 The invoice",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2i9n0v0005inv0001abcd\",\n  \"number\": \"INV-000042\",\n  \"status\": \"sent\",\n  \"externalReference\": \"ORDER-1001\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"currency\": \"ZAR\",\n  \"issueDate\": \"2026-09-24T22:00:00.000Z\",\n  \"dueDate\": \"2026-10-08T21:59:59.000Z\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78,\n      \"taxRate\": 15,\n      \"amount\": 434.78,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"amount\": 120,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"taxInclusive\": false,\n  \"subtotal\": 554.78,\n  \"taxAmount\": 65.22,\n  \"total\": 620,\n  \"amountPaid\": 0,\n  \"amountDue\": 620,\n  \"paidAt\": null,\n  \"payments\": [],\n  \"payUrl\": \"https://app.centrapoint.co.za/pay/Xb7kP2qR9sLm4TvWz8Yc\",\n  \"notes\": \"Payment due within 14 days.\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"createdAt\": \"2026-09-25T08:05:00.000Z\",\n  \"updatedAt\": \"2026-09-25T08:05:00.000Z\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No invoice with this ID or number in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Invoice not found\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Send an invoice",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/invoices/:id/send",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "invoices",
                ":id",
                "send"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2i9n0v0005inv0001abcd",
                  "description": "Invoice ID or invoice number (e.g. INV-000042)."
                }
              ]
            },
            "description": "Emails the invoice to the customer, with a pay link for the balance when possible. A draft becomes `sent`. Paid or cancelled invoices cannot be sent. No body is required. Always emails; to issue without an email use POST /api/v1/invoices/{id}/issue.\n\nReference: https://docs.centrapoint.co.za/reference#sendInvoice"
          },
          "response": [
            {
              "name": "200 The invoice after sending",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "send"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2i9n0v0005inv0001abcd\",\n  \"number\": \"INV-000042\",\n  \"status\": \"sent\",\n  \"externalReference\": \"ORDER-1001\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"currency\": \"ZAR\",\n  \"issueDate\": \"2026-09-24T22:00:00.000Z\",\n  \"dueDate\": \"2026-10-08T21:59:59.000Z\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78,\n      \"taxRate\": 15,\n      \"amount\": 434.78,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"amount\": 120,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"taxInclusive\": false,\n  \"subtotal\": 554.78,\n  \"taxAmount\": 65.22,\n  \"total\": 620,\n  \"amountPaid\": 0,\n  \"amountDue\": 620,\n  \"paidAt\": null,\n  \"payments\": [],\n  \"payUrl\": \"https://app.centrapoint.co.za/pay/Xb7kP2qR9sLm4TvWz8Yc\",\n  \"notes\": \"Payment due within 14 days.\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"createdAt\": \"2026-09-25T08:05:00.000Z\",\n  \"updatedAt\": \"2026-09-25T08:05:00.000Z\"\n}"
            },
            {
              "name": "400 The invoice is in a state that does not allow this, or validation failed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "send"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Invoice is paid\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "send"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No invoice with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "send"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Invoice not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "send"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "send"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Issue an invoice without emailing",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/invoices/:id/issue",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "invoices",
                ":id",
                "issue"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2i9n0v0005inv0001abcd",
                  "description": "Invoice ID or invoice number (e.g. INV-000042)."
                }
              ]
            },
            "description": "Marks a draft invoice as issued (`sent`) without emailing the customer: it becomes payable, reminders and the overdue job apply, it syncs to accounting, `invoice.sent` is sent and a pay link is created when possible. Already issued invoices (sent, overdue, partially paid, paid) are returned unchanged; cancelled invoices return 400. No body is required.\n\nReference: https://docs.centrapoint.co.za/reference#issueInvoice"
          },
          "response": [
            {
              "name": "200 The issued invoice (or the unchanged invoice when it was already issued)",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/issue",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "issue"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2i9n0v0005inv0001abcd\",\n  \"number\": \"INV-000042\",\n  \"status\": \"sent\",\n  \"externalReference\": \"ORDER-1001\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"currency\": \"ZAR\",\n  \"issueDate\": \"2026-09-24T22:00:00.000Z\",\n  \"dueDate\": \"2026-10-08T21:59:59.000Z\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78,\n      \"taxRate\": 15,\n      \"amount\": 434.78,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"amount\": 120,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"taxInclusive\": false,\n  \"subtotal\": 554.78,\n  \"taxAmount\": 65.22,\n  \"total\": 620,\n  \"amountPaid\": 0,\n  \"amountDue\": 620,\n  \"paidAt\": null,\n  \"payments\": [],\n  \"payUrl\": \"https://app.centrapoint.co.za/pay/Xb7kP2qR9sLm4TvWz8Yc\",\n  \"notes\": \"Payment due within 14 days.\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"createdAt\": \"2026-09-25T08:05:00.000Z\",\n  \"updatedAt\": \"2026-09-25T08:05:00.000Z\"\n}"
            },
            {
              "name": "400 The invoice is cancelled",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/issue",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "issue"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Invoice is cancelled\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/issue",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "issue"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No invoice with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/issue",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "issue"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Invoice not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/issue",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "issue"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/issue",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "issue"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Cancel an invoice",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/invoices/:id/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "invoices",
                ":id",
                "cancel"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2i9n0v0005inv0001abcd",
                  "description": "Invoice ID or invoice number (e.g. INV-000042)."
                }
              ]
            },
            "description": "Voids an unpaid (or partially paid) invoice and deactivates its pay links. Cancelling an already cancelled invoice returns it unchanged. Paid invoices cannot be cancelled.\n\nReference: https://docs.centrapoint.co.za/reference#cancelInvoice",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Order cancelled by customer\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 The cancelled invoice",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"Order cancelled by customer\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2i9n0v0005inv0001abcd\",\n  \"number\": \"INV-000042\",\n  \"status\": \"cancelled\",\n  \"externalReference\": \"ORDER-1001\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"currency\": \"ZAR\",\n  \"issueDate\": \"2026-09-24T22:00:00.000Z\",\n  \"dueDate\": \"2026-10-08T21:59:59.000Z\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78,\n      \"taxRate\": 15,\n      \"amount\": 434.78,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"amount\": 120,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"taxInclusive\": false,\n  \"subtotal\": 554.78,\n  \"taxAmount\": 65.22,\n  \"total\": 620,\n  \"amountPaid\": 0,\n  \"amountDue\": 620,\n  \"paidAt\": null,\n  \"payments\": [],\n  \"payUrl\": null,\n  \"notes\": \"Payment due within 14 days.\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"createdAt\": \"2026-09-25T08:05:00.000Z\",\n  \"updatedAt\": \"2026-09-25T08:05:00.000Z\"\n}"
            },
            {
              "name": "400 The invoice is in a state that does not allow this, or validation failed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"Order cancelled by customer\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Paid invoices cannot be cancelled - record a refund or credit instead\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"Order cancelled by customer\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No invoice with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"Order cancelled by customer\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Invoice not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"Order cancelled by customer\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"Order cancelled by customer\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Record an offline payment or allocate an existing payment",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/invoices/:id/payments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "invoices",
                ":id",
                "payments"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2i9n0v0005inv0001abcd",
                  "description": "Invoice ID or invoice number (e.g. INV-000042)."
                }
              ]
            },
            "description": "Two bodies. `{ amount, method, reference?, paidAt? }` records money received outside CentraPoint's gateways (EFT, cash, card machine, wallet credit…). `{ transactionReference }` allocates an existing completed CentraPoint payment that is not linked to an invoice yet (no new money): 201, or 200 when it is already allocated to this invoice; 409 `already_allocated` when it belongs to another invoice; 400 when it is not complete or was refunded, is in another currency or of another customer, or would overpay. The invoice becomes `paid` when fully paid (pay links are deactivated) or `partially_paid` otherwise. Always send an Idempotency-Key so a retry does not record an offline payment twice.\n\nReference: https://docs.centrapoint.co.za/reference#recordInvoicePayment",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"transactionReference\": \"CP-20260930-7K2M9QXA\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 Allocation only: the payment was already allocated to this invoice; the invoice, unchanged",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/payments",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "payments"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"transactionReference\": \"CP-20260930-7K2M9QXA\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2i9n0v0005inv0001abcd\",\n  \"number\": \"INV-000042\",\n  \"status\": \"paid\",\n  \"externalReference\": \"ORDER-1001\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"currency\": \"ZAR\",\n  \"issueDate\": \"2026-09-24T22:00:00.000Z\",\n  \"dueDate\": \"2026-10-08T21:59:59.000Z\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78,\n      \"taxRate\": 15,\n      \"amount\": 434.78,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"amount\": 120,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"taxInclusive\": false,\n  \"subtotal\": 554.78,\n  \"taxAmount\": 65.22,\n  \"total\": 620,\n  \"amountPaid\": 620,\n  \"amountDue\": 0,\n  \"paidAt\": \"2026-10-02T08:15:00.000Z\",\n  \"payments\": [\n    {\n      \"id\": \"cmg2q8r4s0009ipay0001abcd\",\n      \"source\": \"offline\",\n      \"origin\": \"api\",\n      \"method\": \"eft\",\n      \"status\": \"complete\",\n      \"amount\": 620,\n      \"refundedAmount\": 0,\n      \"currency\": \"ZAR\",\n      \"date\": \"2026-10-02T08:15:00.000Z\",\n      \"reference\": \"FNB 2026-10-02 NKOSI\",\n      \"transactionReference\": null\n    }\n  ],\n  \"payUrl\": null,\n  \"notes\": \"Payment due within 14 days.\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"createdAt\": \"2026-09-25T08:05:00.000Z\",\n  \"updatedAt\": \"2026-09-25T08:05:00.000Z\"\n}"
            },
            {
              "name": "201 Payment recorded or allocated; the updated invoice",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/payments",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "payments"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"transactionReference\": \"CP-20260930-7K2M9QXA\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2i9n0v0005inv0001abcd\",\n  \"number\": \"INV-000042\",\n  \"status\": \"paid\",\n  \"externalReference\": \"ORDER-1001\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"currency\": \"ZAR\",\n  \"issueDate\": \"2026-09-24T22:00:00.000Z\",\n  \"dueDate\": \"2026-10-08T21:59:59.000Z\",\n  \"periodStart\": \"2026-10-01\",\n  \"periodEnd\": \"2026-10-31\",\n  \"lines\": [\n    {\n      \"description\": \"Website hosting - October\",\n      \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n      \"quantity\": 1,\n      \"unitPrice\": 434.78,\n      \"taxRate\": 15,\n      \"amount\": 434.78,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Domain renewal (zero-rated)\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 120,\n      \"taxRate\": 0,\n      \"amount\": 120,\n      \"periodStart\": \"2026-10-01\",\n      \"periodEnd\": \"2027-09-30\"\n    }\n  ],\n  \"taxInclusive\": false,\n  \"subtotal\": 554.78,\n  \"taxAmount\": 65.22,\n  \"total\": 620,\n  \"amountPaid\": 620,\n  \"amountDue\": 0,\n  \"paidAt\": \"2026-10-02T08:15:00.000Z\",\n  \"payments\": [\n    {\n      \"id\": \"cmg2q8r4s0009ipay0001abcd\",\n      \"source\": \"offline\",\n      \"origin\": \"api\",\n      \"method\": \"eft\",\n      \"status\": \"complete\",\n      \"amount\": 620,\n      \"refundedAmount\": 0,\n      \"currency\": \"ZAR\",\n      \"date\": \"2026-10-02T08:15:00.000Z\",\n      \"reference\": \"FNB 2026-10-02 NKOSI\",\n      \"transactionReference\": null\n    }\n  ],\n  \"payUrl\": null,\n  \"notes\": \"Payment due within 14 days.\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"createdAt\": \"2026-09-25T08:05:00.000Z\",\n  \"updatedAt\": \"2026-09-25T08:05:00.000Z\"\n}"
            },
            {
              "name": "400 The invoice is in a state that does not allow this, or validation failed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/payments",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "payments"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"transactionReference\": \"CP-20260930-7K2M9QXA\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Amount exceeds the outstanding balance of 620.00\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/payments",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "payments"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"transactionReference\": \"CP-20260930-7K2M9QXA\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No invoice with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/payments",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "payments"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"transactionReference\": \"CP-20260930-7K2M9QXA\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Invoice not found\"\n}"
            },
            {
              "name": "409 already_allocated",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/payments",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "payments"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"transactionReference\": \"CP-20260930-7K2M9QXA\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"already_allocated\",\n  \"message\": \"Transaction CP-20260930-7K2M9QXA is already allocated to another invoice\"\n}"
            },
            {
              "name": "409 idempotency_conflict",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/payments",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "payments"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"transactionReference\": \"CP-20260930-7K2M9QXA\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/payments",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "payments"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i9n0v0005inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"transactionReference\": \"CP-20260930-7K2M9QXA\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Download an invoice PDF",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/invoices/:id/pdf",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "invoices",
                ":id",
                "pdf"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2i4n5v0004inv0001abcd",
                  "description": "Invoice ID or invoice number (e.g. INV-000042)."
                }
              ]
            },
            "description": "The branded invoice PDF (`application/pdf`, sent as an attachment, `Cache-Control: private, no-store`). Requires Invoicing in your plan.\n\nReference: https://docs.centrapoint.co.za/reference#getInvoicePdf"
          },
          "response": [
            {
              "name": "403 No API access, or the plan feature is missing",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/pdf",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "pdf"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i4n5v0004inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No invoice with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/invoices/:id/pdf",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "invoices",
                    ":id",
                    "pdf"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2i4n5v0004inv0001abcd",
                      "description": "Invoice ID or invoice number (e.g. INV-000042)."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Invoice not found\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Quotes",
      "description": "Quotes (estimates) you can convert into invoices. Requires Invoicing.\n\nDocs: https://docs.centrapoint.co.za/quotes",
      "item": [
        {
          "name": "List quotes",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/quotes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "quotes"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "customerId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ]
            },
            "description": "Newest first, with keyset pagination. Sent quotes past their expiry date are reported as `expired`.\n\nReference: https://docs.centrapoint.co.za/reference#listQuotes"
          },
          "response": [
            {
              "name": "200 A page of quotes",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"object\": \"quote\",\n      \"id\": \"cmg3q1a2b0001quo0001abcd\",\n      \"number\": \"QUO-000017\",\n      \"status\": \"sent\",\n      \"issueDate\": \"2026-09-26T22:00:00.000Z\",\n      \"expiryDate\": \"2026-10-26T21:59:59.000Z\",\n      \"periodStart\": null,\n      \"periodEnd\": null,\n      \"currency\": \"ZAR\",\n      \"taxInclusive\": false,\n      \"subtotal\": 5000,\n      \"taxAmount\": 750,\n      \"total\": 5750,\n      \"notes\": \"Valid for 30 days.\",\n      \"customer\": {\n        \"id\": \"cmg2c0s7t0003cust0001abcd\",\n        \"externalReference\": \"CRM-1001\",\n        \"email\": \"thandi@example.co.za\"\n      },\n      \"invoice\": null,\n      \"lineItems\": [\n        {\n          \"description\": \"Website redesign\",\n          \"details\": \"5 pages, mobile layout\\nTwo rounds of changes\",\n          \"quantity\": 1,\n          \"unitPrice\": 4500,\n          \"amount\": 4500,\n          \"taxRate\": 15,\n          \"periodStart\": null,\n          \"periodEnd\": null\n        },\n        {\n          \"description\": \"Hosting setup\",\n          \"details\": null,\n          \"quantity\": 1,\n          \"unitPrice\": 500,\n          \"amount\": 500,\n          \"taxRate\": 15,\n          \"periodStart\": null,\n          \"periodEnd\": null\n        }\n      ],\n      \"sentAt\": \"2026-09-27T08:00:00.000Z\",\n      \"acceptedAt\": null,\n      \"declinedAt\": null,\n      \"createdAt\": \"2026-09-27T07:55:00.000Z\",\n      \"updatedAt\": \"2026-09-27T08:00:00.000Z\"\n    }\n  ],\n  \"hasMore\": false,\n  \"nextCursor\": null\n}"
            },
            {
              "name": "400 Invalid status or unknown `startingAfter`",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"status must be one of draft, sent, accepted, declined, expired, invoiced\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Create a quote",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/quotes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "quotes"
              ]
            },
            "description": "Creates a quote with per-line VAT (same rules as invoices). `send: true` creates it as `sent`. Emits `quote.created` (and `quote.sent`). Requires the Invoicing feature.\n\nReference: https://docs.centrapoint.co.za/reference#createQuote",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"customerExternalReference\": \"CRM-1001\",\n  \"expiryDate\": \"2026-10-26\",\n  \"lineItems\": [\n    {\n      \"description\": \"Website redesign\",\n      \"quantity\": 1,\n      \"unitPrice\": 4500\n    },\n    {\n      \"description\": \"Hosting setup\",\n      \"quantity\": 1,\n      \"unitPrice\": 500\n    }\n  ],\n  \"notes\": \"Valid for 30 days.\",\n  \"send\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 Quote created",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customerExternalReference\": \"CRM-1001\",\n  \"expiryDate\": \"2026-10-26\",\n  \"lineItems\": [\n    {\n      \"description\": \"Website redesign\",\n      \"quantity\": 1,\n      \"unitPrice\": 4500\n    },\n    {\n      \"description\": \"Hosting setup\",\n      \"quantity\": 1,\n      \"unitPrice\": 500\n    }\n  ],\n  \"notes\": \"Valid for 30 days.\",\n  \"send\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"quote\",\n  \"id\": \"cmg3q1a2b0001quo0001abcd\",\n  \"number\": \"QUO-000017\",\n  \"status\": \"sent\",\n  \"issueDate\": \"2026-09-26T22:00:00.000Z\",\n  \"expiryDate\": \"2026-10-26T21:59:59.000Z\",\n  \"periodStart\": null,\n  \"periodEnd\": null,\n  \"currency\": \"ZAR\",\n  \"taxInclusive\": false,\n  \"subtotal\": 5000,\n  \"taxAmount\": 750,\n  \"total\": 5750,\n  \"notes\": \"Valid for 30 days.\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"invoice\": null,\n  \"lineItems\": [\n    {\n      \"description\": \"Website redesign\",\n      \"details\": \"5 pages, mobile layout\\nTwo rounds of changes\",\n      \"quantity\": 1,\n      \"unitPrice\": 4500,\n      \"amount\": 4500,\n      \"taxRate\": 15,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Hosting setup\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 500,\n      \"amount\": 500,\n      \"taxRate\": 15,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    }\n  ],\n  \"sentAt\": \"2026-09-27T08:00:00.000Z\",\n  \"acceptedAt\": null,\n  \"declinedAt\": null,\n  \"createdAt\": \"2026-09-27T07:55:00.000Z\",\n  \"updatedAt\": \"2026-09-27T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed, customer not found, invalid currency, expiry before issue date, or totals invalid",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customerExternalReference\": \"CRM-1001\",\n  \"expiryDate\": \"2026-10-26\",\n  \"lineItems\": [\n    {\n      \"description\": \"Website redesign\",\n      \"quantity\": 1,\n      \"unitPrice\": 4500\n    },\n    {\n      \"description\": \"Hosting setup\",\n      \"quantity\": 1,\n      \"unitPrice\": 500\n    }\n  ],\n  \"notes\": \"Valid for 30 days.\",\n  \"send\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Customer not found\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customerExternalReference\": \"CRM-1001\",\n  \"expiryDate\": \"2026-10-26\",\n  \"lineItems\": [\n    {\n      \"description\": \"Website redesign\",\n      \"quantity\": 1,\n      \"unitPrice\": 4500\n    },\n    {\n      \"description\": \"Hosting setup\",\n      \"quantity\": 1,\n      \"unitPrice\": 500\n    }\n  ],\n  \"notes\": \"Valid for 30 days.\",\n  \"send\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customerExternalReference\": \"CRM-1001\",\n  \"expiryDate\": \"2026-10-26\",\n  \"lineItems\": [\n    {\n      \"description\": \"Website redesign\",\n      \"quantity\": 1,\n      \"unitPrice\": 4500\n    },\n    {\n      \"description\": \"Hosting setup\",\n      \"quantity\": 1,\n      \"unitPrice\": 500\n    }\n  ],\n  \"notes\": \"Valid for 30 days.\",\n  \"send\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Get a quote",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/quotes/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "quotes",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3q1a2b0001quo0001abcd",
                  "description": "Quote ID or quote number."
                }
              ]
            },
            "description": "Reference: https://docs.centrapoint.co.za/reference#getQuote"
          },
          "response": [
            {
              "name": "200 The quote",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"quote\",\n  \"id\": \"cmg3q1a2b0001quo0001abcd\",\n  \"number\": \"QUO-000017\",\n  \"status\": \"sent\",\n  \"issueDate\": \"2026-09-26T22:00:00.000Z\",\n  \"expiryDate\": \"2026-10-26T21:59:59.000Z\",\n  \"periodStart\": null,\n  \"periodEnd\": null,\n  \"currency\": \"ZAR\",\n  \"taxInclusive\": false,\n  \"subtotal\": 5000,\n  \"taxAmount\": 750,\n  \"total\": 5750,\n  \"notes\": \"Valid for 30 days.\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"invoice\": null,\n  \"lineItems\": [\n    {\n      \"description\": \"Website redesign\",\n      \"details\": \"5 pages, mobile layout\\nTwo rounds of changes\",\n      \"quantity\": 1,\n      \"unitPrice\": 4500,\n      \"amount\": 4500,\n      \"taxRate\": 15,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Hosting setup\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 500,\n      \"amount\": 500,\n      \"taxRate\": 15,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    }\n  ],\n  \"sentAt\": \"2026-09-27T08:00:00.000Z\",\n  \"acceptedAt\": null,\n  \"declinedAt\": null,\n  \"createdAt\": \"2026-09-27T07:55:00.000Z\",\n  \"updatedAt\": \"2026-09-27T08:00:00.000Z\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No quote with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Quote not found\"\n}"
            }
          ]
        },
        {
          "name": "Update a quote",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/quotes/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "quotes",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3q1a2b0001quo0001abcd",
                  "description": "Quote ID or quote number."
                }
              ]
            },
            "description": "Edits a draft or sent quote. Omitted fields keep their value; `null` clears `expiryDate`, `notes` or the billing period; `lineItems` replaces every line. Emits `quote.updated`.\n\nReference: https://docs.centrapoint.co.za/reference#updateQuote",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"expiryDate\": \"2026-11-15\",\n  \"notes\": \"Valid until 15 November.\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 The updated quote",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"expiryDate\": \"2026-11-15\",\n  \"notes\": \"Valid until 15 November.\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"quote\",\n  \"id\": \"cmg3q1a2b0001quo0001abcd\",\n  \"number\": \"QUO-000017\",\n  \"status\": \"sent\",\n  \"issueDate\": \"2026-09-26T22:00:00.000Z\",\n  \"expiryDate\": \"2026-10-26T21:59:59.000Z\",\n  \"periodStart\": null,\n  \"periodEnd\": null,\n  \"currency\": \"ZAR\",\n  \"taxInclusive\": false,\n  \"subtotal\": 5000,\n  \"taxAmount\": 750,\n  \"total\": 5750,\n  \"notes\": \"Valid for 30 days.\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"invoice\": null,\n  \"lineItems\": [\n    {\n      \"description\": \"Website redesign\",\n      \"details\": \"5 pages, mobile layout\\nTwo rounds of changes\",\n      \"quantity\": 1,\n      \"unitPrice\": 4500,\n      \"amount\": 4500,\n      \"taxRate\": 15,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Hosting setup\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 500,\n      \"amount\": 500,\n      \"taxRate\": 15,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    }\n  ],\n  \"sentAt\": \"2026-09-27T08:00:00.000Z\",\n  \"acceptedAt\": null,\n  \"declinedAt\": null,\n  \"createdAt\": \"2026-09-27T07:55:00.000Z\",\n  \"updatedAt\": \"2026-09-27T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed, or the quote is not draft or sent",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"expiryDate\": \"2026-11-15\",\n  \"notes\": \"Valid until 15 November.\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"A accepted quote cannot be edited\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"expiryDate\": \"2026-11-15\",\n  \"notes\": \"Valid until 15 November.\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No quote with this ID in your organisation",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"expiryDate\": \"2026-11-15\",\n  \"notes\": \"Valid until 15 November.\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Quote not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"expiryDate\": \"2026-11-15\",\n  \"notes\": \"Valid until 15 November.\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Delete a draft quote",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/quotes/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "quotes",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3q1a2b0001quo0001abcd",
                  "description": "Quote ID or quote number."
                }
              ]
            },
            "description": "Permanently deletes a draft quote. Other quotes return 400 (decline them instead). No webhook is sent.\n\nReference: https://docs.centrapoint.co.za/reference#deleteQuote"
          },
          "response": [
            {
              "name": "200 Deleted",
              "originalRequest": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"quote\",\n  \"id\": \"cmg3q1a2b0001quo0001abcd\",\n  \"number\": \"QUO-000017\",\n  \"deleted\": true\n}"
            },
            {
              "name": "400 The quote is not a draft",
              "originalRequest": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Only draft quotes can be deleted - decline it instead\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No quote with this ID in your organisation",
              "originalRequest": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Quote not found\"\n}"
            }
          ]
        },
        {
          "name": "Mark a quote sent",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/quotes/:id/send",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "quotes",
                ":id",
                "send"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3q1a2b0001quo0001abcd",
                  "description": "Quote ID or quote number."
                }
              ]
            },
            "description": "Marks a draft or expired quote `sent` (an already sent quote is returned unchanged). CentraPoint does not email quotes; share the PDF. Emits `quote.sent`.\n\nReference: https://docs.centrapoint.co.za/reference#sendQuote"
          },
          "response": [
            {
              "name": "200 The updated quote",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "send"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"quote\",\n  \"id\": \"cmg3q1a2b0001quo0001abcd\",\n  \"number\": \"QUO-000017\",\n  \"status\": \"sent\",\n  \"issueDate\": \"2026-09-26T22:00:00.000Z\",\n  \"expiryDate\": \"2026-10-26T21:59:59.000Z\",\n  \"periodStart\": null,\n  \"periodEnd\": null,\n  \"currency\": \"ZAR\",\n  \"taxInclusive\": false,\n  \"subtotal\": 5000,\n  \"taxAmount\": 750,\n  \"total\": 5750,\n  \"notes\": \"Valid for 30 days.\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"invoice\": null,\n  \"lineItems\": [\n    {\n      \"description\": \"Website redesign\",\n      \"details\": \"5 pages, mobile layout\\nTwo rounds of changes\",\n      \"quantity\": 1,\n      \"unitPrice\": 4500,\n      \"amount\": 4500,\n      \"taxRate\": 15,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Hosting setup\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 500,\n      \"amount\": 500,\n      \"taxRate\": 15,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    }\n  ],\n  \"sentAt\": \"2026-09-27T08:00:00.000Z\",\n  \"acceptedAt\": null,\n  \"declinedAt\": null,\n  \"createdAt\": \"2026-09-27T07:55:00.000Z\",\n  \"updatedAt\": \"2026-09-27T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 The status change is not allowed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "send"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"A invoiced quote cannot be marked sent\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "send"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No quote with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "send"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Quote not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "send"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Mark a quote accepted",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/quotes/:id/accept",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "quotes",
                ":id",
                "accept"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3q1a2b0001quo0001abcd",
                  "description": "Quote ID or quote number."
                }
              ]
            },
            "description": "Marks a draft, sent or expired quote `accepted`. Emits `quote.accepted`.\n\nReference: https://docs.centrapoint.co.za/reference#acceptQuote"
          },
          "response": [
            {
              "name": "200 The updated quote",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/accept",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "accept"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"quote\",\n  \"id\": \"cmg3q1a2b0001quo0001abcd\",\n  \"number\": \"QUO-000017\",\n  \"status\": \"accepted\",\n  \"issueDate\": \"2026-09-26T22:00:00.000Z\",\n  \"expiryDate\": \"2026-10-26T21:59:59.000Z\",\n  \"periodStart\": null,\n  \"periodEnd\": null,\n  \"currency\": \"ZAR\",\n  \"taxInclusive\": false,\n  \"subtotal\": 5000,\n  \"taxAmount\": 750,\n  \"total\": 5750,\n  \"notes\": \"Valid for 30 days.\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"invoice\": null,\n  \"lineItems\": [\n    {\n      \"description\": \"Website redesign\",\n      \"details\": \"5 pages, mobile layout\\nTwo rounds of changes\",\n      \"quantity\": 1,\n      \"unitPrice\": 4500,\n      \"amount\": 4500,\n      \"taxRate\": 15,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Hosting setup\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 500,\n      \"amount\": 500,\n      \"taxRate\": 15,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    }\n  ],\n  \"sentAt\": \"2026-09-27T08:00:00.000Z\",\n  \"acceptedAt\": \"2026-09-29T11:02:09.000Z\",\n  \"declinedAt\": null,\n  \"createdAt\": \"2026-09-27T07:55:00.000Z\",\n  \"updatedAt\": \"2026-09-27T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 The status change is not allowed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/accept",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "accept"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"A invoiced quote cannot be marked accepted\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/accept",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "accept"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No quote with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/accept",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "accept"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Quote not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/accept",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "accept"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Mark a quote declined",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/quotes/:id/decline",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "quotes",
                ":id",
                "decline"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3q1a2b0001quo0001abcd",
                  "description": "Quote ID or quote number."
                }
              ]
            },
            "description": "Marks a draft, sent, expired or accepted quote `declined`. Emits `quote.declined`.\n\nReference: https://docs.centrapoint.co.za/reference#declineQuote"
          },
          "response": [
            {
              "name": "200 The updated quote",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/decline",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "decline"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"quote\",\n  \"id\": \"cmg3q1a2b0001quo0001abcd\",\n  \"number\": \"QUO-000017\",\n  \"status\": \"declined\",\n  \"issueDate\": \"2026-09-26T22:00:00.000Z\",\n  \"expiryDate\": \"2026-10-26T21:59:59.000Z\",\n  \"periodStart\": null,\n  \"periodEnd\": null,\n  \"currency\": \"ZAR\",\n  \"taxInclusive\": false,\n  \"subtotal\": 5000,\n  \"taxAmount\": 750,\n  \"total\": 5750,\n  \"notes\": \"Valid for 30 days.\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"invoice\": null,\n  \"lineItems\": [\n    {\n      \"description\": \"Website redesign\",\n      \"details\": \"5 pages, mobile layout\\nTwo rounds of changes\",\n      \"quantity\": 1,\n      \"unitPrice\": 4500,\n      \"amount\": 4500,\n      \"taxRate\": 15,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    },\n    {\n      \"description\": \"Hosting setup\",\n      \"details\": null,\n      \"quantity\": 1,\n      \"unitPrice\": 500,\n      \"amount\": 500,\n      \"taxRate\": 15,\n      \"periodStart\": null,\n      \"periodEnd\": null\n    }\n  ],\n  \"sentAt\": \"2026-09-27T08:00:00.000Z\",\n  \"acceptedAt\": null,\n  \"declinedAt\": \"2026-09-29T11:02:09.000Z\",\n  \"createdAt\": \"2026-09-27T07:55:00.000Z\",\n  \"updatedAt\": \"2026-09-27T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 The status change is not allowed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/decline",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "decline"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"A invoiced quote cannot be marked declined\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/decline",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "decline"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No quote with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/decline",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "decline"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Quote not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/decline",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "decline"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Convert a quote to an invoice",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/quotes/:id/convert",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "quotes",
                ":id",
                "convert"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3q1a2b0001quo0001abcd",
                  "description": "Quote ID or quote number."
                }
              ]
            },
            "description": "Creates a draft invoice from the quote's lines (due in `dueDays`), marks the quote `invoiced` and links them. A pay link is created when your plan includes payment links and a gateway accepts the currency. Emits `quote.invoiced` and `invoice.created`.\n\nReference: https://docs.centrapoint.co.za/reference#convertQuote",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"dueDays\": 14\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 The invoiced quote and the new invoice",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/convert",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "convert"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"dueDays\": 14\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"quote\": {\n    \"object\": \"quote\",\n    \"id\": \"cmg3q1a2b0001quo0001abcd\",\n    \"number\": \"QUO-000017\",\n    \"status\": \"invoiced\",\n    \"issueDate\": \"2026-09-26T22:00:00.000Z\",\n    \"expiryDate\": \"2026-10-26T21:59:59.000Z\",\n    \"periodStart\": null,\n    \"periodEnd\": null,\n    \"currency\": \"ZAR\",\n    \"taxInclusive\": false,\n    \"subtotal\": 5000,\n    \"taxAmount\": 750,\n    \"total\": 5750,\n    \"notes\": \"Valid for 30 days.\",\n    \"customer\": {\n      \"id\": \"cmg2c0s7t0003cust0001abcd\",\n      \"externalReference\": \"CRM-1001\",\n      \"email\": \"thandi@example.co.za\"\n    },\n    \"invoice\": {\n      \"id\": \"cmg3i2j3k0004inv0061abcd\",\n      \"number\": \"INV-000061\",\n      \"status\": \"draft\",\n      \"externalReference\": null\n    },\n    \"lineItems\": [\n      {\n        \"description\": \"Website redesign\",\n        \"details\": \"5 pages, mobile layout\\nTwo rounds of changes\",\n        \"quantity\": 1,\n        \"unitPrice\": 4500,\n        \"amount\": 4500,\n        \"taxRate\": 15,\n        \"periodStart\": null,\n        \"periodEnd\": null\n      },\n      {\n        \"description\": \"Hosting setup\",\n        \"details\": null,\n        \"quantity\": 1,\n        \"unitPrice\": 500,\n        \"amount\": 500,\n        \"taxRate\": 15,\n        \"periodStart\": null,\n        \"periodEnd\": null\n      }\n    ],\n    \"sentAt\": \"2026-09-27T08:00:00.000Z\",\n    \"acceptedAt\": \"2026-09-29T11:05:00.000Z\",\n    \"declinedAt\": null,\n    \"createdAt\": \"2026-09-27T07:55:00.000Z\",\n    \"updatedAt\": \"2026-09-27T08:00:00.000Z\"\n  },\n  \"invoice\": {\n    \"id\": \"cmg3i2j3k0004inv0061abcd\",\n    \"number\": \"INV-000061\",\n    \"status\": \"draft\",\n    \"externalReference\": null,\n    \"customer\": {\n      \"id\": \"cmg2c0s7t0003cust0001abcd\",\n      \"externalReference\": \"CRM-1001\",\n      \"email\": \"thandi@example.co.za\"\n    },\n    \"currency\": \"ZAR\",\n    \"issueDate\": \"2026-09-24T22:00:00.000Z\",\n    \"dueDate\": \"2026-10-08T21:59:59.000Z\",\n    \"periodStart\": \"2026-10-01\",\n    \"periodEnd\": \"2026-10-31\",\n    \"lines\": [\n      {\n        \"description\": \"Website hosting - October\",\n        \"details\": \"Business hosting plan\\nDomain: nkosi.example.co.za\",\n        \"quantity\": 1,\n        \"unitPrice\": 434.78,\n        \"taxRate\": 15,\n        \"amount\": 434.78,\n        \"periodStart\": null,\n        \"periodEnd\": null\n      },\n      {\n        \"description\": \"Domain renewal (zero-rated)\",\n        \"details\": null,\n        \"quantity\": 1,\n        \"unitPrice\": 120,\n        \"taxRate\": 0,\n        \"amount\": 120,\n        \"periodStart\": \"2026-10-01\",\n        \"periodEnd\": \"2027-09-30\"\n      }\n    ],\n    \"taxInclusive\": false,\n    \"subtotal\": 554.78,\n    \"taxAmount\": 65.22,\n    \"total\": 620,\n    \"amountPaid\": 0,\n    \"amountDue\": 620,\n    \"paidAt\": null,\n    \"payments\": [],\n    \"payUrl\": \"https://app.centrapoint.co.za/pay/Xb7kP2qR9sLm4TvWz8Yc\",\n    \"notes\": \"Payment due within 14 days.\",\n    \"metadata\": {\n      \"crmId\": \"0061x00000AbCdE\"\n    },\n    \"createdAt\": \"2026-09-25T08:05:00.000Z\",\n    \"updatedAt\": \"2026-09-25T08:05:00.000Z\"\n  }\n}"
            },
            {
              "name": "400 The quote is declined or already invoiced",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/convert",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "convert"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"dueDays\": 14\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"This quote has already been invoiced\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/convert",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "convert"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"dueDays\": 14\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No quote with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/convert",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "convert"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"dueDays\": 14\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Quote not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/convert",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "convert"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"dueDays\": 14\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Download a quote PDF",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/quotes/:id/pdf",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "quotes",
                ":id",
                "pdf"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3q1a2b0001quo0001abcd",
                  "description": "Quote ID or quote number."
                }
              ]
            },
            "description": "The branded quote PDF (`application/pdf`, sent as an attachment, `Cache-Control: private, no-store`). Requires Invoicing in your plan.\n\nReference: https://docs.centrapoint.co.za/reference#getQuotePdf"
          },
          "response": [
            {
              "name": "403 No API access, or the plan feature is missing",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/pdf",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "pdf"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No quote with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/quotes/:id/pdf",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "quotes",
                    ":id",
                    "pdf"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3q1a2b0001quo0001abcd",
                      "description": "Quote ID or quote number."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Quote not found\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Credit notes",
      "description": "Credit notes: apply credit to invoices or pay it back. Requires Invoicing.\n\nDocs: https://docs.centrapoint.co.za/credit-notes",
      "item": [
        {
          "name": "List credit notes",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/credit-notes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "credit-notes"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "customerId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "invoiceId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ]
            },
            "description": "Newest first, with keyset pagination.\n\nReference: https://docs.centrapoint.co.za/reference#listCreditNotes"
          },
          "response": [
            {
              "name": "200 A page of credit notes",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "invoiceId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"object\": \"credit_note\",\n      \"id\": \"cmg3c7d8e0002crn0001abcd\",\n      \"number\": \"CN-000008\",\n      \"status\": \"issued\",\n      \"issueDate\": \"2026-09-27T09:10:00.000Z\",\n      \"periodStart\": \"2026-09-01\",\n      \"periodEnd\": \"2026-09-30\",\n      \"reason\": \"Hosting downtime 12-14 September\",\n      \"currency\": \"ZAR\",\n      \"taxInclusive\": false,\n      \"subtotal\": 200,\n      \"taxAmount\": 30,\n      \"total\": 230,\n      \"amountApplied\": 100,\n      \"amountRefunded\": 0,\n      \"balance\": 130,\n      \"customer\": {\n        \"id\": \"cmg2c0s7t0003cust0001abcd\",\n        \"externalReference\": \"CRM-1001\",\n        \"email\": \"thandi@example.co.za\"\n      },\n      \"invoice\": {\n        \"id\": \"cmg2i9n0v0005inv0001abcd\",\n        \"number\": \"INV-000042\",\n        \"externalReference\": \"ORDER-1001\"\n      },\n      \"lineItems\": [\n        {\n          \"description\": \"Service credit - downtime\",\n          \"details\": \"Outage 12-14 September (3 days)\",\n          \"quantity\": 1,\n          \"unitPrice\": 200,\n          \"amount\": 200,\n          \"taxRate\": 15,\n          \"periodStart\": \"2026-09-12\",\n          \"periodEnd\": \"2026-09-14\"\n        }\n      ],\n      \"history\": [\n        {\n          \"at\": \"2026-09-27T09:20:00.000Z\",\n          \"kind\": \"applied\",\n          \"amount\": 100,\n          \"ref\": \"INV-000051\"\n        }\n      ],\n      \"refunds\": [],\n      \"payouts\": [],\n      \"issuedAt\": \"2026-09-27T09:10:00.000Z\",\n      \"voidedAt\": null,\n      \"createdAt\": \"2026-09-27T09:10:00.000Z\",\n      \"updatedAt\": \"2026-09-27T09:20:00.000Z\"\n    }\n  ],\n  \"hasMore\": false,\n  \"nextCursor\": null\n}"
            },
            {
              "name": "400 Invalid status or unknown `startingAfter`",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "invoiceId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"status must be one of draft, issued, applied, refunded, void\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "invoiceId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Create a credit note",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/credit-notes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "credit-notes"
              ]
            },
            "description": "Creates a credit note, optionally against an invoice (customer, currency and tax rate then come from the invoice; credit notes on one invoice can't exceed its total). `issue: true` issues it immediately. Emits `credit_note.created` (and `credit_note.issued`). Requires the Invoicing feature.\n\nReference: https://docs.centrapoint.co.za/reference#createCreditNote",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"invoiceId\": \"cmg2i9n0v0005inv0001abcd\",\n  \"reason\": \"Hosting downtime 12-14 September\",\n  \"lineItems\": [\n    {\n      \"description\": \"Service credit - downtime\",\n      \"quantity\": 1,\n      \"unitPrice\": 200\n    }\n  ],\n  \"issue\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 Credit note created",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"invoiceId\": \"cmg2i9n0v0005inv0001abcd\",\n  \"reason\": \"Hosting downtime 12-14 September\",\n  \"lineItems\": [\n    {\n      \"description\": \"Service credit - downtime\",\n      \"quantity\": 1,\n      \"unitPrice\": 200\n    }\n  ],\n  \"issue\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"credit_note\",\n  \"id\": \"cmg3c7d8e0002crn0001abcd\",\n  \"number\": \"CN-000008\",\n  \"status\": \"issued\",\n  \"issueDate\": \"2026-09-27T09:10:00.000Z\",\n  \"periodStart\": \"2026-09-01\",\n  \"periodEnd\": \"2026-09-30\",\n  \"reason\": \"Hosting downtime 12-14 September\",\n  \"currency\": \"ZAR\",\n  \"taxInclusive\": false,\n  \"subtotal\": 200,\n  \"taxAmount\": 30,\n  \"total\": 230,\n  \"amountApplied\": 0,\n  \"amountRefunded\": 0,\n  \"balance\": 230,\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"invoice\": {\n    \"id\": \"cmg2i9n0v0005inv0001abcd\",\n    \"number\": \"INV-000042\",\n    \"externalReference\": \"ORDER-1001\"\n  },\n  \"lineItems\": [\n    {\n      \"description\": \"Service credit - downtime\",\n      \"details\": \"Outage 12-14 September (3 days)\",\n      \"quantity\": 1,\n      \"unitPrice\": 200,\n      \"amount\": 200,\n      \"taxRate\": 15,\n      \"periodStart\": \"2026-09-12\",\n      \"periodEnd\": \"2026-09-14\"\n    }\n  ],\n  \"history\": [],\n  \"refunds\": [],\n  \"payouts\": [],\n  \"issuedAt\": \"2026-09-27T09:10:00.000Z\",\n  \"voidedAt\": null,\n  \"createdAt\": \"2026-09-27T09:10:00.000Z\",\n  \"updatedAt\": \"2026-09-27T09:10:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed; customer or invoice not found; the invoice belongs to another customer; credit above the invoice ",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"invoiceId\": \"cmg2i9n0v0005inv0001abcd\",\n  \"reason\": \"Hosting downtime 12-14 September\",\n  \"lineItems\": [\n    {\n      \"description\": \"Service credit - downtime\",\n      \"quantity\": 1,\n      \"unitPrice\": 200\n    }\n  ],\n  \"issue\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Credit notes cannot exceed the invoice total of 620.00\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"invoiceId\": \"cmg2i9n0v0005inv0001abcd\",\n  \"reason\": \"Hosting downtime 12-14 September\",\n  \"lineItems\": [\n    {\n      \"description\": \"Service credit - downtime\",\n      \"quantity\": 1,\n      \"unitPrice\": 200\n    }\n  ],\n  \"issue\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"invoiceId\": \"cmg2i9n0v0005inv0001abcd\",\n  \"reason\": \"Hosting downtime 12-14 September\",\n  \"lineItems\": [\n    {\n      \"description\": \"Service credit - downtime\",\n      \"quantity\": 1,\n      \"unitPrice\": 200\n    }\n  ],\n  \"issue\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Get a credit note",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/credit-notes/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "credit-notes",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3c7d8e0002crn0001abcd",
                  "description": "Credit note ID or number."
                }
              ]
            },
            "description": "Reference: https://docs.centrapoint.co.za/reference#getCreditNote"
          },
          "response": [
            {
              "name": "200 The credit note",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"credit_note\",\n  \"id\": \"cmg3c7d8e0002crn0001abcd\",\n  \"number\": \"CN-000008\",\n  \"status\": \"issued\",\n  \"issueDate\": \"2026-09-27T09:10:00.000Z\",\n  \"periodStart\": \"2026-09-01\",\n  \"periodEnd\": \"2026-09-30\",\n  \"reason\": \"Hosting downtime 12-14 September\",\n  \"currency\": \"ZAR\",\n  \"taxInclusive\": false,\n  \"subtotal\": 200,\n  \"taxAmount\": 30,\n  \"total\": 230,\n  \"amountApplied\": 100,\n  \"amountRefunded\": 0,\n  \"balance\": 130,\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"invoice\": {\n    \"id\": \"cmg2i9n0v0005inv0001abcd\",\n    \"number\": \"INV-000042\",\n    \"externalReference\": \"ORDER-1001\"\n  },\n  \"lineItems\": [\n    {\n      \"description\": \"Service credit - downtime\",\n      \"details\": \"Outage 12-14 September (3 days)\",\n      \"quantity\": 1,\n      \"unitPrice\": 200,\n      \"amount\": 200,\n      \"taxRate\": 15,\n      \"periodStart\": \"2026-09-12\",\n      \"periodEnd\": \"2026-09-14\"\n    }\n  ],\n  \"history\": [\n    {\n      \"at\": \"2026-09-27T09:20:00.000Z\",\n      \"kind\": \"applied\",\n      \"amount\": 100,\n      \"ref\": \"INV-000051\"\n    }\n  ],\n  \"refunds\": [],\n  \"payouts\": [],\n  \"issuedAt\": \"2026-09-27T09:10:00.000Z\",\n  \"voidedAt\": null,\n  \"createdAt\": \"2026-09-27T09:10:00.000Z\",\n  \"updatedAt\": \"2026-09-27T09:20:00.000Z\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No credit note with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Credit note not found\"\n}"
            }
          ]
        },
        {
          "name": "Issue a credit note",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/credit-notes/:id/issue",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "credit-notes",
                ":id",
                "issue"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3c7d8e0002crn0001abcd",
                  "description": "Credit note ID or number."
                }
              ]
            },
            "description": "Draft → issued, so its credit can be used. Emits `credit_note.issued`.\n\nReference: https://docs.centrapoint.co.za/reference#issueCreditNote"
          },
          "response": [
            {
              "name": "200 The issued credit note",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/issue",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "issue"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"credit_note\",\n  \"id\": \"cmg3c7d8e0002crn0001abcd\",\n  \"number\": \"CN-000008\",\n  \"status\": \"issued\",\n  \"issueDate\": \"2026-09-27T09:10:00.000Z\",\n  \"periodStart\": \"2026-09-01\",\n  \"periodEnd\": \"2026-09-30\",\n  \"reason\": \"Hosting downtime 12-14 September\",\n  \"currency\": \"ZAR\",\n  \"taxInclusive\": false,\n  \"subtotal\": 200,\n  \"taxAmount\": 30,\n  \"total\": 230,\n  \"amountApplied\": 100,\n  \"amountRefunded\": 0,\n  \"balance\": 130,\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"invoice\": {\n    \"id\": \"cmg2i9n0v0005inv0001abcd\",\n    \"number\": \"INV-000042\",\n    \"externalReference\": \"ORDER-1001\"\n  },\n  \"lineItems\": [\n    {\n      \"description\": \"Service credit - downtime\",\n      \"details\": \"Outage 12-14 September (3 days)\",\n      \"quantity\": 1,\n      \"unitPrice\": 200,\n      \"amount\": 200,\n      \"taxRate\": 15,\n      \"periodStart\": \"2026-09-12\",\n      \"periodEnd\": \"2026-09-14\"\n    }\n  ],\n  \"history\": [\n    {\n      \"at\": \"2026-09-27T09:20:00.000Z\",\n      \"kind\": \"applied\",\n      \"amount\": 100,\n      \"ref\": \"INV-000051\"\n    }\n  ],\n  \"refunds\": [],\n  \"payouts\": [],\n  \"issuedAt\": \"2026-09-27T09:10:00.000Z\",\n  \"voidedAt\": null,\n  \"createdAt\": \"2026-09-27T09:10:00.000Z\",\n  \"updatedAt\": \"2026-09-27T09:20:00.000Z\"\n}"
            },
            {
              "name": "400 Not a draft",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/issue",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "issue"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Only draft credit notes can be issued\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/issue",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "issue"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No credit note with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/issue",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "issue"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Credit note not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/issue",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "issue"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Void a credit note",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/credit-notes/:id/void",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "credit-notes",
                ":id",
                "void"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3c7d8e0002crn0001abcd",
                  "description": "Credit note ID or number."
                }
              ]
            },
            "description": "Voids an unused draft or issued credit note (a void one is returned unchanged). The reason is added to the notes. Emits `credit_note.voided`.\n\nReference: https://docs.centrapoint.co.za/reference#voidCreditNote",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Issued in error\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 The void credit note",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/void",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "void"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"Issued in error\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"credit_note\",\n  \"id\": \"cmg3c7d8e0002crn0001abcd\",\n  \"number\": \"CN-000008\",\n  \"status\": \"void\",\n  \"issueDate\": \"2026-09-27T09:10:00.000Z\",\n  \"periodStart\": \"2026-09-01\",\n  \"periodEnd\": \"2026-09-30\",\n  \"reason\": \"Hosting downtime 12-14 September\",\n  \"currency\": \"ZAR\",\n  \"taxInclusive\": false,\n  \"subtotal\": 200,\n  \"taxAmount\": 30,\n  \"total\": 230,\n  \"amountApplied\": 0,\n  \"amountRefunded\": 0,\n  \"balance\": 230,\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"invoice\": {\n    \"id\": \"cmg2i9n0v0005inv0001abcd\",\n    \"number\": \"INV-000042\",\n    \"externalReference\": \"ORDER-1001\"\n  },\n  \"lineItems\": [\n    {\n      \"description\": \"Service credit - downtime\",\n      \"details\": \"Outage 12-14 September (3 days)\",\n      \"quantity\": 1,\n      \"unitPrice\": 200,\n      \"amount\": 200,\n      \"taxRate\": 15,\n      \"periodStart\": \"2026-09-12\",\n      \"periodEnd\": \"2026-09-14\"\n    }\n  ],\n  \"history\": [],\n  \"refunds\": [],\n  \"payouts\": [],\n  \"issuedAt\": \"2026-09-27T09:10:00.000Z\",\n  \"voidedAt\": \"2026-09-27T09:30:00.000Z\",\n  \"createdAt\": \"2026-09-27T09:10:00.000Z\",\n  \"updatedAt\": \"2026-09-27T09:20:00.000Z\"\n}"
            },
            {
              "name": "400 The credit note has been used",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/void",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "void"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"Issued in error\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"This credit note has been used - it cannot be voided\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/void",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "void"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"Issued in error\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No credit note with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/void",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "void"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"Issued in error\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Credit note not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/void",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "void"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"Issued in error\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Apply credit to an invoice",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/credit-notes/:id/apply",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "credit-notes",
                ":id",
                "apply"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3c7d8e0002crn0001abcd",
                  "description": "Credit note ID or number."
                }
              ]
            },
            "description": "Records an invoice payment (method `credit_note`) on an unpaid invoice of the same customer and currency. Emits `credit_note.applied` (and `invoice.paid` / `invoice.partially_paid`). Always send an Idempotency-Key.\n\nReference: https://docs.centrapoint.co.za/reference#applyCreditNote",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"invoiceId\": \"cmg2i9n0v0005inv0051abcd\",\n  \"amount\": 100\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 The updated credit note",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/apply",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "apply"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"invoiceId\": \"cmg2i9n0v0005inv0051abcd\",\n  \"amount\": 100\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"credit_note\",\n  \"id\": \"cmg3c7d8e0002crn0001abcd\",\n  \"number\": \"CN-000008\",\n  \"status\": \"issued\",\n  \"issueDate\": \"2026-09-27T09:10:00.000Z\",\n  \"periodStart\": \"2026-09-01\",\n  \"periodEnd\": \"2026-09-30\",\n  \"reason\": \"Hosting downtime 12-14 September\",\n  \"currency\": \"ZAR\",\n  \"taxInclusive\": false,\n  \"subtotal\": 200,\n  \"taxAmount\": 30,\n  \"total\": 230,\n  \"amountApplied\": 100,\n  \"amountRefunded\": 0,\n  \"balance\": 130,\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"invoice\": {\n    \"id\": \"cmg2i9n0v0005inv0001abcd\",\n    \"number\": \"INV-000042\",\n    \"externalReference\": \"ORDER-1001\"\n  },\n  \"lineItems\": [\n    {\n      \"description\": \"Service credit - downtime\",\n      \"details\": \"Outage 12-14 September (3 days)\",\n      \"quantity\": 1,\n      \"unitPrice\": 200,\n      \"amount\": 200,\n      \"taxRate\": 15,\n      \"periodStart\": \"2026-09-12\",\n      \"periodEnd\": \"2026-09-14\"\n    }\n  ],\n  \"history\": [\n    {\n      \"at\": \"2026-09-27T09:20:00.000Z\",\n      \"kind\": \"applied\",\n      \"amount\": 100,\n      \"ref\": \"INV-000051\"\n    }\n  ],\n  \"refunds\": [],\n  \"payouts\": [],\n  \"issuedAt\": \"2026-09-27T09:10:00.000Z\",\n  \"voidedAt\": null,\n  \"createdAt\": \"2026-09-27T09:10:00.000Z\",\n  \"updatedAt\": \"2026-09-27T09:20:00.000Z\"\n}"
            },
            {
              "name": "400 Not issued, amount above the balance, or invoice not found / another customer / another currency",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/apply",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "apply"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"invoiceId\": \"cmg2i9n0v0005inv0051abcd\",\n  \"amount\": 100\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"The credit balance is 130.00\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/apply",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "apply"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"invoiceId\": \"cmg2i9n0v0005inv0051abcd\",\n  \"amount\": 100\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No credit note with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/apply",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "apply"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"invoiceId\": \"cmg2i9n0v0005inv0051abcd\",\n  \"amount\": 100\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Credit note not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/apply",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "apply"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"invoiceId\": \"cmg2i9n0v0005inv0051abcd\",\n  \"amount\": 100\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Pay credit back",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/credit-notes/:id/refund",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "credit-notes",
                ":id",
                "refund"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3c7d8e0002crn0001abcd",
                  "description": "Credit note ID or number."
                }
              ]
            },
            "description": "Pays credit back: `payment` records a refund on one of the customer's completed payments (process it in the gateway's portal); `payout` schedules a Netcash payout to the customer's bank account (ZAR); `manual` records a pay-back done outside CentraPoint. Emits `credit_note.refunded`. Always send an Idempotency-Key.\n\nReference: https://docs.centrapoint.co.za/reference#refundCreditNote",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"method\": \"payout\",\n  \"amount\": 130,\n  \"actionDate\": \"2026-10-01\",\n  \"bank\": {\n    \"accountHolder\": \"T Nkosi\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"bankName\": \"FNB\"\n  },\n  \"beneficiaryEmail\": \"thandi@example.co.za\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 The updated credit note",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/refund",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "refund"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"method\": \"payout\",\n  \"amount\": 130,\n  \"actionDate\": \"2026-10-01\",\n  \"bank\": {\n    \"accountHolder\": \"T Nkosi\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"bankName\": \"FNB\"\n  },\n  \"beneficiaryEmail\": \"thandi@example.co.za\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"credit_note\",\n  \"id\": \"cmg3c7d8e0002crn0001abcd\",\n  \"number\": \"CN-000008\",\n  \"status\": \"applied\",\n  \"issueDate\": \"2026-09-27T09:10:00.000Z\",\n  \"periodStart\": \"2026-09-01\",\n  \"periodEnd\": \"2026-09-30\",\n  \"reason\": \"Hosting downtime 12-14 September\",\n  \"currency\": \"ZAR\",\n  \"taxInclusive\": false,\n  \"subtotal\": 200,\n  \"taxAmount\": 30,\n  \"total\": 230,\n  \"amountApplied\": 100,\n  \"amountRefunded\": 130,\n  \"balance\": 0,\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"invoice\": {\n    \"id\": \"cmg2i9n0v0005inv0001abcd\",\n    \"number\": \"INV-000042\",\n    \"externalReference\": \"ORDER-1001\"\n  },\n  \"lineItems\": [\n    {\n      \"description\": \"Service credit - downtime\",\n      \"details\": \"Outage 12-14 September (3 days)\",\n      \"quantity\": 1,\n      \"unitPrice\": 200,\n      \"amount\": 200,\n      \"taxRate\": 15,\n      \"periodStart\": \"2026-09-12\",\n      \"periodEnd\": \"2026-09-14\"\n    }\n  ],\n  \"history\": [\n    {\n      \"at\": \"2026-09-27T09:20:00.000Z\",\n      \"kind\": \"applied\",\n      \"amount\": 100,\n      \"ref\": \"INV-000051\"\n    },\n    {\n      \"at\": \"2026-09-30T10:00:00.000Z\",\n      \"kind\": \"manual\",\n      \"amount\": 130,\n      \"ref\": \"FNB 2026-09-30 NKOSI\",\n      \"note\": \"eft\"\n    }\n  ],\n  \"refunds\": [],\n  \"payouts\": [],\n  \"issuedAt\": \"2026-09-27T09:10:00.000Z\",\n  \"voidedAt\": null,\n  \"createdAt\": \"2026-09-27T09:10:00.000Z\",\n  \"updatedAt\": \"2026-09-27T09:20:00.000Z\"\n}"
            },
            {
              "name": "400 Not issued; amount above the balance; payment not found or not refundable; invalid bank details; no payout gateway; ",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/refund",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "refund"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"method\": \"payout\",\n  \"amount\": 130,\n  \"actionDate\": \"2026-10-01\",\n  \"bank\": {\n    \"accountHolder\": \"T Nkosi\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"bankName\": \"FNB\"\n  },\n  \"beneficiaryEmail\": \"thandi@example.co.za\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Payment not found\"\n}"
            },
            {
              "name": "403 Plan does not include the API or invoicing, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/refund",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "refund"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"method\": \"payout\",\n  \"amount\": 130,\n  \"actionDate\": \"2026-10-01\",\n  \"bank\": {\n    \"accountHolder\": \"T Nkosi\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"bankName\": \"FNB\"\n  },\n  \"beneficiaryEmail\": \"thandi@example.co.za\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No credit note with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/refund",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "refund"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"method\": \"payout\",\n  \"amount\": 130,\n  \"actionDate\": \"2026-10-01\",\n  \"bank\": {\n    \"accountHolder\": \"T Nkosi\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"bankName\": \"FNB\"\n  },\n  \"beneficiaryEmail\": \"thandi@example.co.za\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Credit note not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/refund",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "refund"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"method\": \"payout\",\n  \"amount\": 130,\n  \"actionDate\": \"2026-10-01\",\n  \"bank\": {\n    \"accountHolder\": \"T Nkosi\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"bankName\": \"FNB\"\n  },\n  \"beneficiaryEmail\": \"thandi@example.co.za\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Download a credit note PDF",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/credit-notes/:id/pdf",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "credit-notes",
                ":id",
                "pdf"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3c7d8e0002crn0001abcd",
                  "description": "Credit note ID or number."
                }
              ]
            },
            "description": "The branded credit note PDF (`application/pdf`, sent as an attachment, `Cache-Control: private, no-store`). Requires Invoicing in your plan.\n\nReference: https://docs.centrapoint.co.za/reference#getCreditNotePdf"
          },
          "response": [
            {
              "name": "403 No API access, or the plan feature is missing",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/pdf",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "pdf"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No credit note with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/credit-notes/:id/pdf",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "credit-notes",
                    ":id",
                    "pdf"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3c7d8e0002crn0001abcd",
                      "description": "Credit note ID or number."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Credit note not found\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Payment links",
      "description": "Hosted checkout links you can send to payers.\n\nDocs: https://docs.centrapoint.co.za/payment-links",
      "item": [
        {
          "name": "List payment links",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/payment-links",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "payment-links"
              ],
              "query": [
                {
                  "key": "externalReference",
                  "value": "ORDER-1001",
                  "description": "Only links with exactly this external reference (leading/trailing whitespace ignored).",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Maximum number of links to return, 1–100. Invalid or missing values fall back to 20; values out of range are clamped.",
                  "disabled": true
                }
              ]
            },
            "description": "Returns your organisation's payment links, newest first, each with the payments made through it (up to 50 per link). Filter by `externalReference` to find the link for one of your orders and discover its payment references.\n\nReference: https://docs.centrapoint.co.za/reference#listPaymentLinks"
          },
          "response": [
            {
              "name": "200 Matching links",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ],
                  "query": [
                    {
                      "key": "externalReference",
                      "value": "ORDER-1001",
                      "description": "Only links with exactly this external reference (leading/trailing whitespace ignored).",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "Maximum number of links to return, 1–100. Invalid or missing values fall back to 20; values out of range are clamped.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg1k2x3y0001abcd1234efgh\",\n      \"url\": \"https://app.centrapoint.co.za/pay/Xb7kP2qR9sLm4TvWz8Yc\",\n      \"title\": \"Website hosting - October\",\n      \"description\": \"Monthly hosting for example.co.za\",\n      \"amount\": 499,\n      \"currency\": \"ZAR\",\n      \"externalReference\": \"ORDER-1001\",\n      \"singleUse\": true,\n      \"active\": false,\n      \"expiresAt\": \"2026-10-31T21:59:59.000Z\",\n      \"paidCount\": 1,\n      \"createdAt\": \"2026-09-25T08:10:02.114Z\",\n      \"payments\": [\n        {\n          \"reference\": \"CP-20260925-9F3A1C7B\",\n          \"status\": \"complete\",\n          \"amount\": 499,\n          \"currency\": \"ZAR\",\n          \"paidAt\": \"2026-09-25T08:14:03.512Z\",\n          \"createdAt\": \"2026-09-25T08:12:47.020Z\"\n        },\n        {\n          \"reference\": \"CP-20260925-41D07E2A\",\n          \"status\": \"cancelled\",\n          \"amount\": 499,\n          \"currency\": \"ZAR\",\n          \"paidAt\": null,\n          \"createdAt\": \"2026-09-25T08:11:15.873Z\"\n        }\n      ],\n      \"returnUrl\": null,\n      \"metadata\": {},\n      \"recurring\": null,\n      \"subscription\": null\n    }\n  ]\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ],
                  "query": [
                    {
                      "key": "externalReference",
                      "value": "ORDER-1001",
                      "description": "Only links with exactly this external reference (leading/trailing whitespace ignored).",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "Maximum number of links to return, 1–100. Invalid or missing values fall back to 20; values out of range are clamped.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ],
                  "query": [
                    {
                      "key": "externalReference",
                      "value": "ORDER-1001",
                      "description": "Only links with exactly this external reference (leading/trailing whitespace ignored).",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "Maximum number of links to return, 1–100. Invalid or missing values fall back to 20; values out of range are clamped.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Create a payment link",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/payment-links",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "payment-links"
              ]
            },
            "description": "Creates a hosted payment link at `/pay/{token}`. When `customerEmail` is supplied, the link is attached to the existing customer with that email address in your organisation, or a new customer is created (subject to your plan's customer limit).\n\nRequires the API and Payment links features on your plan, and an account that is not read-only (suspended, cancelled or expired trial).\n\nPass `externalReference` (your order ID) so you can later find the link and the payment references made through it with `GET /api/v1/payment-links?externalReference=`.\n\nUnknown body fields are ignored. This endpoint is **not idempotent**: retrying a request creates another link.\n\nReference: https://docs.centrapoint.co.za/reference#createPaymentLink",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Pro plan\",\n  \"amount\": 499,\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"recurring\": {\n    \"frequency\": \"monthly\"\n  },\n  \"singleUse\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 Payment link created",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"title\": \"Pro plan\",\n  \"amount\": 499,\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"recurring\": {\n    \"frequency\": \"monthly\"\n  },\n  \"singleUse\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg1k2x3y0001abcd1234efgh\",\n  \"url\": \"https://app.centrapoint.co.za/pay/Xb7kP2qR9sLm4TvWz8Yc\",\n  \"title\": \"Website hosting - October\",\n  \"description\": \"Monthly hosting for example.co.za\",\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"externalReference\": \"ORDER-1001\",\n  \"singleUse\": true,\n  \"active\": true,\n  \"expiresAt\": \"2026-10-31T21:59:59.000Z\",\n  \"paidCount\": 0,\n  \"createdAt\": \"2026-09-25T08:10:02.114Z\",\n  \"returnUrl\": \"https://shop.example.co.za/checkout/done\",\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"recurring\": null\n}"
            },
            {
              "name": "400 Validation failure",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"title\": \"Pro plan\",\n  \"amount\": 499,\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"recurring\": {\n    \"frequency\": \"monthly\"\n  },\n  \"singleUse\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Invalid body\",\n  \"issues\": [\n    {\n      \"origin\": \"number\",\n      \"code\": \"too_small\",\n      \"minimum\": 0,\n      \"inclusive\": false,\n      \"path\": [\n        \"amount\"\n      ],\n      \"message\": \"Too small: expected number to be >0\"\n    }\n  ]\n}"
            },
            {
              "name": "400 Unknown product",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"title\": \"Pro plan\",\n  \"amount\": 499,\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"recurring\": {\n    \"frequency\": \"monthly\"\n  },\n  \"singleUse\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Product not found\"\n}"
            },
            {
              "name": "400 Currency not accepted",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"title\": \"Pro plan\",\n  \"amount\": 499,\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"recurring\": {\n    \"frequency\": \"monthly\"\n  },\n  \"singleUse\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"None of your enabled payment gateways accept USD. Enable a gateway that supports USD first.\"\n}"
            },
            {
              "name": "400 Expiry in the past",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"title\": \"Pro plan\",\n  \"amount\": 499,\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"recurring\": {\n    \"frequency\": \"monthly\"\n  },\n  \"singleUse\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"expiresAt must be in the future\"\n}"
            },
            {
              "name": "400 returnUrl origin not allowed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"title\": \"Pro plan\",\n  \"amount\": 499,\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"recurring\": {\n    \"frequency\": \"monthly\"\n  },\n  \"singleUse\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"returnUrl origin https://shop.example.co.za is not allowed - add it under Settings > API keys > Allowed return URLs\"\n}"
            },
            {
              "name": "403 planRestricted",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"title\": \"Pro plan\",\n  \"amount\": 499,\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"recurring\": {\n    \"frequency\": \"monthly\"\n  },\n  \"singleUse\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "403 planLimit",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"title\": \"Pro plan\",\n  \"amount\": 499,\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"recurring\": {\n    \"frequency\": \"monthly\"\n  },\n  \"singleUse\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_limit\",\n  \"message\": \"Customers limit reached (2000/2000) on the Growth plan. Upgrade under Settings > Billing.\"\n}"
            },
            {
              "name": "403 accountRestricted",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"title\": \"Pro plan\",\n  \"amount\": 499,\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"recurring\": {\n    \"frequency\": \"monthly\"\n  },\n  \"singleUse\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"title\": \"Pro plan\",\n  \"amount\": 499,\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"recurring\": {\n    \"frequency\": \"monthly\"\n  },\n  \"singleUse\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            },
            {
              "name": "413 Request body larger than 100 000 characters",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"title\": \"Pro plan\",\n  \"amount\": 499,\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"recurring\": {\n    \"frequency\": \"monthly\"\n  },\n  \"singleUse\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Payload Too Large",
              "code": 413,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Request body too large\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"title\": \"Pro plan\",\n  \"amount\": 499,\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"recurring\": {\n    \"frequency\": \"monthly\"\n  },\n  \"singleUse\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Get a payment link",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/payment-links/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "payment-links",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg1k2x3y0001abcd1234efgh",
                  "description": "Payment link ID returned when the link was created."
                }
              ]
            },
            "description": "Returns one payment link in your organisation with the payments made through it (newest first, up to 100).\n\nReference: https://docs.centrapoint.co.za/reference#getPaymentLink"
          },
          "response": [
            {
              "name": "200 The payment link",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg1k2x3y0001abcd1234efgh",
                      "description": "Payment link ID returned when the link was created."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg1k2x3y0001abcd1234efgh\",\n  \"url\": \"https://app.centrapoint.co.za/pay/Xb7kP2qR9sLm4TvWz8Yc\",\n  \"title\": \"Website hosting - October\",\n  \"description\": \"Monthly hosting for example.co.za\",\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"externalReference\": \"ORDER-1001\",\n  \"singleUse\": true,\n  \"active\": false,\n  \"expiresAt\": \"2026-10-31T21:59:59.000Z\",\n  \"paidCount\": 1,\n  \"createdAt\": \"2026-09-25T08:10:02.114Z\",\n  \"payments\": [\n    {\n      \"reference\": \"CP-20260925-9F3A1C7B\",\n      \"status\": \"complete\",\n      \"amount\": 499,\n      \"currency\": \"ZAR\",\n      \"paidAt\": \"2026-09-25T08:14:03.512Z\",\n      \"createdAt\": \"2026-09-25T08:12:47.020Z\"\n    },\n    {\n      \"reference\": \"CP-20260925-41D07E2A\",\n      \"status\": \"cancelled\",\n      \"amount\": 499,\n      \"currency\": \"ZAR\",\n      \"paidAt\": null,\n      \"createdAt\": \"2026-09-25T08:11:15.873Z\"\n    }\n  ],\n  \"returnUrl\": null,\n  \"metadata\": {},\n  \"recurring\": null,\n  \"subscription\": null\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg1k2x3y0001abcd1234efgh",
                      "description": "Payment link ID returned when the link was created."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            },
            {
              "name": "404 No payment link with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg1k2x3y0001abcd1234efgh",
                      "description": "Payment link ID returned when the link was created."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Payment link not found\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payment-links/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payment-links",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg1k2x3y0001abcd1234efgh",
                      "description": "Payment link ID returned when the link was created."
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Checkout sessions",
      "description": "Pre-filled hosted checkout URLs for packages, plans and products.\n\nDocs: https://docs.centrapoint.co.za/hosted-checkout",
      "item": [
        {
          "name": "List checkout sessions",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/checkout-sessions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "checkout-sessions"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "Filter by reported status: `expired` also matches pending and failed sessions past `expiresAt`; `pending` and `failed` only match sessions that have not expired.",
                  "disabled": true
                },
                {
                  "key": "customerId",
                  "value": "",
                  "description": "Filter by customer.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                }
              ]
            },
            "description": "Newest first.\n\nReference: https://docs.centrapoint.co.za/reference#listCheckoutSessions"
          },
          "response": [
            {
              "name": "200 Sessions",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/checkout-sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "checkout-sessions"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Filter by reported status: `expired` also matches pending and failed sessions past `expiresAt`; `pending` and `failed` only match sessions that have not expired.",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg5k1s2e0010cks0001abcd\",\n      \"object\": \"checkout_session\",\n      \"status\": \"pending\",\n      \"source\": \"api\",\n      \"checkoutUrl\": \"https://app.centrapoint.co.za/c/acme/package/cmg4p1a2b0001pkg0001abcd?session=Xk3…\",\n      \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n      \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n      \"productId\": null,\n      \"customerId\": null,\n      \"subscriptionId\": null,\n      \"couponCode\": \"WELCOME10\",\n      \"returnUrl\": \"https://www.example.co.za/thanks\",\n      \"prefill\": {\n        \"email\": \"thandi@example.co.za\",\n        \"firstName\": \"Thandi\",\n        \"lastName\": \"Nkosi\"\n      },\n      \"metadata\": {\n        \"signupId\": \"SU-9921\"\n      },\n      \"transaction\": null,\n      \"expiresAt\": \"2026-09-29T08:30:00.000Z\",\n      \"usedAt\": null,\n      \"createdAt\": \"2026-09-28T08:30:00.000Z\",\n      \"updatedAt\": \"2026-09-28T08:30:00.000Z\"\n    }\n  ]\n}"
            },
            {
              "name": "400 Invalid status",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/checkout-sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "checkout-sessions"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Filter by reported status: `expired` also matches pending and failed sessions past `expiresAt`; `pending` and `failed` only match sessions that have not expired.",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"status must be one of pending, completed, failed, expired\"\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/checkout-sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "checkout-sessions"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Filter by reported status: `expired` also matches pending and failed sessions past `expiresAt`; `pending` and `failed` only match sessions that have not expired.",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Create a checkout session",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/checkout-sessions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "checkout-sessions"
              ]
            },
            "description": "Returns a pre-filled hosted checkout URL for a package (optionally with a preselected plan) or a product, valid for 24 hours. Follow the outcome with `GET /api/v1/checkout-sessions/{id}` or the `checkout.completed` / `checkout.failed` webhooks.\n\nReference: https://docs.centrapoint.co.za/reference#createCheckoutSession",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"returnUrl\": \"https://www.example.co.za/thanks\",\n  \"customer\": {\n    \"email\": \"thandi@example.co.za\",\n    \"firstName\": \"Thandi\",\n    \"lastName\": \"Nkosi\"\n  },\n  \"couponCode\": \"WELCOME10\",\n  \"metadata\": {\n    \"signupId\": \"SU-9921\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 The session",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/checkout-sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "checkout-sessions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"returnUrl\": \"https://www.example.co.za/thanks\",\n  \"customer\": {\n    \"email\": \"thandi@example.co.za\",\n    \"firstName\": \"Thandi\",\n    \"lastName\": \"Nkosi\"\n  },\n  \"couponCode\": \"WELCOME10\",\n  \"metadata\": {\n    \"signupId\": \"SU-9921\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg5k1s2e0010cks0001abcd\",\n  \"object\": \"checkout_session\",\n  \"status\": \"pending\",\n  \"source\": \"api\",\n  \"checkoutUrl\": \"https://app.centrapoint.co.za/c/acme/package/cmg4p1a2b0001pkg0001abcd?session=Xk3…\",\n  \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n  \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"productId\": null,\n  \"customerId\": null,\n  \"subscriptionId\": null,\n  \"couponCode\": \"WELCOME10\",\n  \"returnUrl\": \"https://www.example.co.za/thanks\",\n  \"prefill\": {\n    \"email\": \"thandi@example.co.za\",\n    \"firstName\": \"Thandi\",\n    \"lastName\": \"Nkosi\"\n  },\n  \"metadata\": {\n    \"signupId\": \"SU-9921\"\n  },\n  \"transaction\": null,\n  \"expiresAt\": \"2026-09-29T08:30:00.000Z\",\n  \"usedAt\": null,\n  \"createdAt\": \"2026-09-28T08:30:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:30:00.000Z\",\n  \"sessionId\": \"cmg5k1s2e0010cks0001abcd\"\n}"
            },
            {
              "name": "400 Validation failed: nothing or both kinds of target, unknown/disabled package, plan or product, returnUrl not https o",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/checkout-sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "checkout-sessions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"returnUrl\": \"https://www.example.co.za/thanks\",\n  \"customer\": {\n    \"email\": \"thandi@example.co.za\",\n    \"firstName\": \"Thandi\",\n    \"lastName\": \"Nkosi\"\n  },\n  \"couponCode\": \"WELCOME10\",\n  \"metadata\": {\n    \"signupId\": \"SU-9921\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"returnUrl origin https://www.example.co.za is not allowed - add it under Settings > API keys > Allowed return URLs\"\n}"
            },
            {
              "name": "403 `plan_restricted`: no REST API",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/checkout-sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "checkout-sessions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"returnUrl\": \"https://www.example.co.za/thanks\",\n  \"customer\": {\n    \"email\": \"thandi@example.co.za\",\n    \"firstName\": \"Thandi\",\n    \"lastName\": \"Nkosi\"\n  },\n  \"couponCode\": \"WELCOME10\",\n  \"metadata\": {\n    \"signupId\": \"SU-9921\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_limit\",\n  \"message\": \"Recurring card billing is not included in the Starter plan. Upgrade under Settings > Billing.\"\n}"
            },
            {
              "name": "409 Idempotency-Key reused with a different body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/checkout-sessions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "checkout-sessions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"returnUrl\": \"https://www.example.co.za/thanks\",\n  \"customer\": {\n    \"email\": \"thandi@example.co.za\",\n    \"firstName\": \"Thandi\",\n    \"lastName\": \"Nkosi\"\n  },\n  \"couponCode\": \"WELCOME10\",\n  \"metadata\": {\n    \"signupId\": \"SU-9921\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Get a checkout session",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/checkout-sessions/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "checkout-sessions",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg5k1s2e0010cks0001abcd"
                }
              ]
            },
            "description": "Status, the payment (reference, status, amounts) and the resulting subscription.\n\nReference: https://docs.centrapoint.co.za/reference#getCheckoutSession"
          },
          "response": [
            {
              "name": "200 The session",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/checkout-sessions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "checkout-sessions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg5k1s2e0010cks0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg5k1s2e0010cks0001abcd\",\n  \"object\": \"checkout_session\",\n  \"status\": \"pending\",\n  \"source\": \"api\",\n  \"checkoutUrl\": \"https://app.centrapoint.co.za/c/acme/package/cmg4p1a2b0001pkg0001abcd?session=Xk3…\",\n  \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n  \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"productId\": null,\n  \"customerId\": null,\n  \"subscriptionId\": null,\n  \"couponCode\": \"WELCOME10\",\n  \"returnUrl\": \"https://www.example.co.za/thanks\",\n  \"prefill\": {\n    \"email\": \"thandi@example.co.za\",\n    \"firstName\": \"Thandi\",\n    \"lastName\": \"Nkosi\"\n  },\n  \"metadata\": {\n    \"signupId\": \"SU-9921\"\n  },\n  \"transaction\": null,\n  \"expiresAt\": \"2026-09-29T08:30:00.000Z\",\n  \"usedAt\": null,\n  \"createdAt\": \"2026-09-28T08:30:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:30:00.000Z\"\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/checkout-sessions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "checkout-sessions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg5k1s2e0010cks0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            },
            {
              "name": "404 No session with this ID",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/checkout-sessions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "checkout-sessions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg5k1s2e0010cks0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Checkout session not found\"\n}"
            }
          ]
        },
        {
          "name": "Create a checkout session (ASAP compatibility)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/billing-webhook/checkout",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "billing-webhook",
                "checkout"
              ]
            },
            "description": "Compatibility alias of `POST /api/v1/checkout-sessions` for integrations built against the ASAP API: `subscriptionId` is the plan ID and payer details go in `client`. Same authentication, validation and errors.\n\nReference: https://docs.centrapoint.co.za/reference#billingWebhookCheckout",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"subscriptionId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"returnUrl\": \"https://www.example.co.za/thanks\",\n  \"client\": {\n    \"email\": \"thandi@example.co.za\",\n    \"firstName\": \"Thandi\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 Created",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/billing-webhook/checkout",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "billing-webhook",
                    "checkout"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"subscriptionId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"returnUrl\": \"https://www.example.co.za/thanks\",\n  \"client\": {\n    \"email\": \"thandi@example.co.za\",\n    \"firstName\": \"Thandi\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"checkoutUrl\": \"https://app.centrapoint.co.za/c/acme/package/cmg4p1a2b0001pkg0001abcd?session=Xk3…\",\n  \"sessionId\": \"cmg5k1s2e0010cks0001abcd\",\n  \"expiresAt\": \"2026-09-29T08:30:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/billing-webhook/checkout",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "billing-webhook",
                    "checkout"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"subscriptionId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"returnUrl\": \"https://www.example.co.za/thanks\",\n  \"client\": {\n    \"email\": \"thandi@example.co.za\",\n    \"firstName\": \"Thandi\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"packageId, planId or productId is required\"\n}"
            },
            {
              "name": "403 No API access, or the account is read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/billing-webhook/checkout",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "billing-webhook",
                    "checkout"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"subscriptionId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"returnUrl\": \"https://www.example.co.za/thanks\",\n  \"client\": {\n    \"email\": \"thandi@example.co.za\",\n    \"firstName\": \"Thandi\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Coupons",
      "description": "Discount codes for checkout and subscriptions. Requires Coupons.\n\nDocs: https://docs.centrapoint.co.za/coupons",
      "item": [
        {
          "name": "List coupons",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/coupons",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "coupons"
              ],
              "query": [
                {
                  "key": "code",
                  "value": "",
                  "description": "Exact code (case-insensitive).",
                  "disabled": true
                },
                {
                  "key": "enabled",
                  "value": "",
                  "description": "Only enabled/disabled coupons.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                }
              ]
            },
            "description": "Newest first, with redemption counts.\n\nReference: https://docs.centrapoint.co.za/reference#listCoupons"
          },
          "response": [
            {
              "name": "200 Coupons",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons"
                  ],
                  "query": [
                    {
                      "key": "code",
                      "value": "",
                      "description": "Exact code (case-insensitive).",
                      "disabled": true
                    },
                    {
                      "key": "enabled",
                      "value": "",
                      "description": "Only enabled/disabled coupons.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg5c0u1p0011cpn0001abcd\",\n      \"object\": \"coupon\",\n      \"code\": \"WELCOME10\",\n      \"description\": \"10% off the first month\",\n      \"type\": \"percent\",\n      \"value\": 10,\n      \"currency\": null,\n      \"appliesTo\": \"any\",\n      \"productIds\": [],\n      \"planIds\": [],\n      \"duration\": \"once\",\n      \"durationCycles\": null,\n      \"validFrom\": null,\n      \"validTo\": \"2026-12-31T21:59:59.000Z\",\n      \"maxRedemptions\": 500,\n      \"maxPerCustomer\": 1,\n      \"minAmount\": null,\n      \"enabled\": true,\n      \"redemptions\": {\n        \"redeemed\": 12,\n        \"pending\": 1\n      },\n      \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n      \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n    }\n  ]\n}"
            },
            {
              "name": "403 No REST API or Coupons in your plan (`plan_restricted`), or the account is read-only (`account_restricted`, writes)",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons"
                  ],
                  "query": [
                    {
                      "key": "code",
                      "value": "",
                      "description": "Exact code (case-insensitive).",
                      "disabled": true
                    },
                    {
                      "key": "enabled",
                      "value": "",
                      "description": "Only enabled/disabled coupons.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"Coupons are not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Create a coupon",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/coupons",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "coupons"
              ]
            },
            "description": "Reference: https://docs.centrapoint.co.za/reference#createCoupon",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"code\": \"WELCOME10\",\n  \"description\": \"10% off the first month\",\n  \"type\": \"percent\",\n  \"value\": 10,\n  \"duration\": \"once\",\n  \"validTo\": \"2026-12-31T23:59:59+02:00\",\n  \"maxRedemptions\": 500,\n  \"maxPerCustomer\": 1\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 The coupon",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"code\": \"WELCOME10\",\n  \"description\": \"10% off the first month\",\n  \"type\": \"percent\",\n  \"value\": 10,\n  \"duration\": \"once\",\n  \"validTo\": \"2026-12-31T23:59:59+02:00\",\n  \"maxRedemptions\": 500,\n  \"maxPerCustomer\": 1\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg5c0u1p0011cpn0001abcd\",\n  \"object\": \"coupon\",\n  \"code\": \"WELCOME10\",\n  \"description\": \"10% off the first month\",\n  \"type\": \"percent\",\n  \"value\": 10,\n  \"currency\": null,\n  \"appliesTo\": \"any\",\n  \"productIds\": [],\n  \"planIds\": [],\n  \"duration\": \"once\",\n  \"durationCycles\": null,\n  \"validFrom\": null,\n  \"validTo\": \"2026-12-31T21:59:59.000Z\",\n  \"maxRedemptions\": 500,\n  \"maxPerCustomer\": 1,\n  \"minAmount\": null,\n  \"enabled\": true,\n  \"redemptions\": {\n    \"redeemed\": 0,\n    \"pending\": 0\n  },\n  \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed (code format, percentage over 100, fixed without currency, repeating without durationCycles, valid",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"code\": \"WELCOME10\",\n  \"description\": \"10% off the first month\",\n  \"type\": \"percent\",\n  \"value\": 10,\n  \"duration\": \"once\",\n  \"validTo\": \"2026-12-31T23:59:59+02:00\",\n  \"maxRedemptions\": 500,\n  \"maxPerCustomer\": 1\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"A fixed discount needs a currency\"\n}"
            },
            {
              "name": "403 No REST API or Coupons in your plan (`plan_restricted`), or the account is read-only (`account_restricted`, writes)",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"code\": \"WELCOME10\",\n  \"description\": \"10% off the first month\",\n  \"type\": \"percent\",\n  \"value\": 10,\n  \"duration\": \"once\",\n  \"validTo\": \"2026-12-31T23:59:59+02:00\",\n  \"maxRedemptions\": 500,\n  \"maxPerCustomer\": 1\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"Coupons are not included in your plan\"\n}"
            },
            {
              "name": "409 Idempotency-Key reused with a different body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"code\": \"WELCOME10\",\n  \"description\": \"10% off the first month\",\n  \"type\": \"percent\",\n  \"value\": 10,\n  \"duration\": \"once\",\n  \"validTo\": \"2026-12-31T23:59:59+02:00\",\n  \"maxRedemptions\": 500,\n  \"maxPerCustomer\": 1\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Validate a coupon",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/coupons/validate",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "coupons",
                "validate"
              ]
            },
            "description": "Would this code apply to a product or plan (for this customer)? Nothing is reserved or redeemed. An unusable code is a 200 with `valid: false`. The Idempotency-Key header is not used.\n\nReference: https://docs.centrapoint.co.za/reference#validateCoupon",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"code\": \"WELCOME10\",\n  \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"customerEmail\": \"thandi@example.co.za\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 valid",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons/validate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons",
                    "validate"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"code\": \"WELCOME10\",\n  \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"customerEmail\": \"thandi@example.co.za\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"valid\": true,\n  \"discount\": 49.9,\n  \"amount\": 499,\n  \"total\": 449.1,\n  \"currency\": \"ZAR\",\n  \"coupon\": {\n    \"id\": \"cmg5c0u1p0011cpn0001abcd\",\n    \"object\": \"coupon\",\n    \"code\": \"WELCOME10\",\n    \"description\": \"10% off the first month\",\n    \"type\": \"percent\",\n    \"value\": 10,\n    \"currency\": null,\n    \"appliesTo\": \"any\",\n    \"productIds\": [],\n    \"planIds\": [],\n    \"duration\": \"once\",\n    \"durationCycles\": null,\n    \"validFrom\": null,\n    \"validTo\": \"2026-12-31T21:59:59.000Z\",\n    \"maxRedemptions\": 500,\n    \"maxPerCustomer\": 1,\n    \"minAmount\": null,\n    \"enabled\": true,\n    \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n    \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n  }\n}"
            },
            {
              "name": "200 invalid",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons/validate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons",
                    "validate"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"code\": \"WELCOME10\",\n  \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"customerEmail\": \"thandi@example.co.za\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"valid\": false,\n  \"reason\": \"expired\",\n  \"message\": \"This coupon has expired\"\n}"
            },
            {
              "name": "400 Validation failed (e",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons/validate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons",
                    "validate"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"code\": \"WELCOME10\",\n  \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"customerEmail\": \"thandi@example.co.za\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Invalid body\"\n}"
            },
            {
              "name": "403 No REST API or Coupons in your plan (`plan_restricted`), or the account is read-only (`account_restricted`, writes)",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons/validate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons",
                    "validate"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"code\": \"WELCOME10\",\n  \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"customerEmail\": \"thandi@example.co.za\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"Coupons are not included in your plan\"\n}"
            },
            {
              "name": "404 Product or plan not found",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons/validate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons",
                    "validate"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"code\": \"WELCOME10\",\n  \"planId\": \"cmg4p1a2b0002pln0001abcd\",\n  \"customerEmail\": \"thandi@example.co.za\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Plan not found\"\n}"
            }
          ]
        },
        {
          "name": "Get a coupon",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/coupons/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "coupons",
                ":id"
              ],
              "query": [
                {
                  "key": "include",
                  "value": "",
                  "description": "`redemptions`.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg5c0u1p0011cpn0001abcd"
                }
              ]
            },
            "description": "`?include=redemptions` adds `recentRedemptions`: the latest 100 redemptions (`id, status, discountAmount, customerId, subscriptionId, transactionReference, createdAt`). `redemptions` stays the counts object.\n\nReference: https://docs.centrapoint.co.za/reference#getCoupon"
          },
          "response": [
            {
              "name": "200 The coupon",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons",
                    ":id"
                  ],
                  "query": [
                    {
                      "key": "include",
                      "value": "",
                      "description": "`redemptions`.",
                      "disabled": true
                    }
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg5c0u1p0011cpn0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg5c0u1p0011cpn0001abcd\",\n  \"object\": \"coupon\",\n  \"code\": \"WELCOME10\",\n  \"description\": \"10% off the first month\",\n  \"type\": \"percent\",\n  \"value\": 10,\n  \"currency\": null,\n  \"appliesTo\": \"any\",\n  \"productIds\": [],\n  \"planIds\": [],\n  \"duration\": \"once\",\n  \"durationCycles\": null,\n  \"validFrom\": null,\n  \"validTo\": \"2026-12-31T21:59:59.000Z\",\n  \"maxRedemptions\": 500,\n  \"maxPerCustomer\": 1,\n  \"minAmount\": null,\n  \"enabled\": true,\n  \"redemptions\": {\n    \"redeemed\": 12,\n    \"pending\": 1\n  },\n  \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n}"
            },
            {
              "name": "403 No REST API or Coupons in your plan (`plan_restricted`), or the account is read-only (`account_restricted`, writes)",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons",
                    ":id"
                  ],
                  "query": [
                    {
                      "key": "include",
                      "value": "",
                      "description": "`redemptions`.",
                      "disabled": true
                    }
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg5c0u1p0011cpn0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"Coupons are not included in your plan\"\n}"
            },
            {
              "name": "404 No coupon with this ID",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons",
                    ":id"
                  ],
                  "query": [
                    {
                      "key": "include",
                      "value": "",
                      "description": "`redemptions`.",
                      "disabled": true
                    }
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg5c0u1p0011cpn0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Coupon not found\"\n}"
            }
          ]
        },
        {
          "name": "Update a coupon",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/coupons/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "coupons",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg5c0u1p0011cpn0001abcd"
                }
              ]
            },
            "description": "Any create field, validated after merging with the stored coupon. Send `{\"enabled\": false}` to disable; there is no DELETE. The Idempotency-Key header is not used.\n\nReference: https://docs.centrapoint.co.za/reference#updateCoupon",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"enabled\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 The updated coupon",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg5c0u1p0011cpn0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"enabled\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg5c0u1p0011cpn0001abcd\",\n  \"object\": \"coupon\",\n  \"code\": \"WELCOME10\",\n  \"description\": \"10% off the first month\",\n  \"type\": \"percent\",\n  \"value\": 10,\n  \"currency\": null,\n  \"appliesTo\": \"any\",\n  \"productIds\": [],\n  \"planIds\": [],\n  \"duration\": \"once\",\n  \"durationCycles\": null,\n  \"validFrom\": null,\n  \"validTo\": \"2026-12-31T21:59:59.000Z\",\n  \"maxRedemptions\": 500,\n  \"maxPerCustomer\": 1,\n  \"minAmount\": null,\n  \"enabled\": false,\n  \"redemptions\": {\n    \"redeemed\": 12,\n    \"pending\": 1\n  },\n  \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg5c0u1p0011cpn0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"enabled\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"A percentage cannot be more than 100\"\n}"
            },
            {
              "name": "403 No REST API or Coupons in your plan (`plan_restricted`), or the account is read-only (`account_restricted`, writes)",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg5c0u1p0011cpn0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"enabled\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"Coupons are not included in your plan\"\n}"
            },
            {
              "name": "404 No coupon with this ID",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/coupons/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "coupons",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg5c0u1p0011cpn0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"enabled\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Coupon not found\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Packages & plans",
      "description": "Subscription packages and their plans (price points). Requires Recurring billing.\n\nDocs: https://docs.centrapoint.co.za/subscription-plans",
      "item": [
        {
          "name": "List packages",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/packages",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "packages"
              ],
              "query": [
                {
                  "key": "enabled",
                  "value": "",
                  "description": "`true`: only enabled packages, each with only its enabled plans. `false`: only disabled packages.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                }
              ]
            },
            "description": "Subscription packages with their plans, in sort order. Requires the REST API and Recurring billing in your plan (`403 plan_restricted` otherwise).\n\nReference: https://docs.centrapoint.co.za/reference#listPackages"
          },
          "response": [
            {
              "name": "200 Packages",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages"
                  ],
                  "query": [
                    {
                      "key": "enabled",
                      "value": "",
                      "description": "`true`: only enabled packages, each with only its enabled plans. `false`: only disabled packages.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg4p1a2b0001pkg0001abcd\",\n      \"object\": \"package\",\n      \"name\": \"Acme Cloud\",\n      \"description\": \"Hosted project management\",\n      \"enabled\": true,\n      \"sortOrder\": 0,\n      \"defaultProviderId\": \"cmg1p0v1d0001prov0001abcd\",\n      \"plans\": [\n        {\n          \"id\": \"cmg4p1a2b0002pln0001abcd\",\n          \"object\": \"plan\",\n          \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n          \"name\": \"Pro\",\n          \"description\": \"For growing teams\",\n          \"features\": [\n            \"Unlimited projects\",\n            \"Priority support\"\n          ],\n          \"hasCallToAction\": false,\n          \"callToActionUrl\": null,\n          \"hasContactUs\": false,\n          \"enabled\": true,\n          \"frequency\": \"monthly\",\n          \"amount\": 499,\n          \"setupFee\": 0,\n          \"currency\": \"ZAR\",\n          \"trialDays\": 14,\n          \"billingCycles\": null,\n          \"providerIds\": [],\n          \"sortOrder\": 1,\n          \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n          \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n        }\n      ],\n      \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n      \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n    }\n  ]\n}"
            },
            {
              "name": "403 No API access, or the plan feature is missing",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages"
                  ],
                  "query": [
                    {
                      "key": "enabled",
                      "value": "",
                      "description": "`true`: only enabled packages, each with only its enabled plans. `false`: only disabled packages.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"Recurring billing is not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Create a package",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/packages",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "packages"
              ]
            },
            "description": "Creates a package, optionally with up to 20 plans. Requires the REST API and Recurring billing in your plan (`403 plan_restricted` otherwise).\n\nReference: https://docs.centrapoint.co.za/reference#createPackage",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Acme Cloud\",\n  \"description\": \"Hosted project management\",\n  \"plans\": [\n    {\n      \"name\": \"Pro\",\n      \"frequency\": \"monthly\",\n      \"amount\": 499,\n      \"trialDays\": 14,\n      \"features\": [\n        \"Unlimited projects\",\n        \"Priority support\"\n      ]\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 The new package with its plans",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Acme Cloud\",\n  \"description\": \"Hosted project management\",\n  \"plans\": [\n    {\n      \"name\": \"Pro\",\n      \"frequency\": \"monthly\",\n      \"amount\": 499,\n      \"trialDays\": 14,\n      \"features\": [\n        \"Unlimited projects\",\n        \"Priority support\"\n      ]\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4p1a2b0001pkg0001abcd\",\n  \"object\": \"package\",\n  \"name\": \"Acme Cloud\",\n  \"description\": \"Hosted project management\",\n  \"enabled\": true,\n  \"sortOrder\": 0,\n  \"defaultProviderId\": \"cmg1p0v1d0001prov0001abcd\",\n  \"plans\": [\n    {\n      \"id\": \"cmg4p1a2b0002pln0001abcd\",\n      \"object\": \"plan\",\n      \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n      \"name\": \"Pro\",\n      \"description\": \"For growing teams\",\n      \"features\": [\n        \"Unlimited projects\",\n        \"Priority support\"\n      ],\n      \"hasCallToAction\": false,\n      \"callToActionUrl\": null,\n      \"hasContactUs\": false,\n      \"enabled\": true,\n      \"frequency\": \"monthly\",\n      \"amount\": 499,\n      \"setupFee\": 0,\n      \"currency\": \"ZAR\",\n      \"trialDays\": 14,\n      \"billingCycles\": null,\n      \"providerIds\": [],\n      \"sortOrder\": 1,\n      \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n      \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n    }\n  ],\n  \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed, e",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Acme Cloud\",\n  \"description\": \"Hosted project management\",\n  \"plans\": [\n    {\n      \"name\": \"Pro\",\n      \"frequency\": \"monthly\",\n      \"amount\": 499,\n      \"trialDays\": 14,\n      \"features\": [\n        \"Unlimited projects\",\n        \"Priority support\"\n      ]\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Payment provider not found\"\n}"
            },
            {
              "name": "403 No API access, plan feature missing, or the account is read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Acme Cloud\",\n  \"description\": \"Hosted project management\",\n  \"plans\": [\n    {\n      \"name\": \"Pro\",\n      \"frequency\": \"monthly\",\n      \"amount\": 499,\n      \"trialDays\": 14,\n      \"features\": [\n        \"Unlimited projects\",\n        \"Priority support\"\n      ]\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "409 Idempotency-Key reused with a different body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Acme Cloud\",\n  \"description\": \"Hosted project management\",\n  \"plans\": [\n    {\n      \"name\": \"Pro\",\n      \"frequency\": \"monthly\",\n      \"amount\": 499,\n      \"trialDays\": 14,\n      \"features\": [\n        \"Unlimited projects\",\n        \"Priority support\"\n      ]\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Get a package",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/packages/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "packages",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4p1a2b0001pkg0001abcd"
                }
              ]
            },
            "description": "The package with all its plans (enabled and disabled). Requires the REST API and Recurring billing in your plan (`403 plan_restricted` otherwise).\n\nReference: https://docs.centrapoint.co.za/reference#getPackage"
          },
          "response": [
            {
              "name": "200 The package",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4p1a2b0001pkg0001abcd\",\n  \"object\": \"package\",\n  \"name\": \"Acme Cloud\",\n  \"description\": \"Hosted project management\",\n  \"enabled\": true,\n  \"sortOrder\": 0,\n  \"defaultProviderId\": \"cmg1p0v1d0001prov0001abcd\",\n  \"plans\": [\n    {\n      \"id\": \"cmg4p1a2b0002pln0001abcd\",\n      \"object\": \"plan\",\n      \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n      \"name\": \"Pro\",\n      \"description\": \"For growing teams\",\n      \"features\": [\n        \"Unlimited projects\",\n        \"Priority support\"\n      ],\n      \"hasCallToAction\": false,\n      \"callToActionUrl\": null,\n      \"hasContactUs\": false,\n      \"enabled\": true,\n      \"frequency\": \"monthly\",\n      \"amount\": 499,\n      \"setupFee\": 0,\n      \"currency\": \"ZAR\",\n      \"trialDays\": 14,\n      \"billingCycles\": null,\n      \"providerIds\": [],\n      \"sortOrder\": 1,\n      \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n      \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n    }\n  ],\n  \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n}"
            },
            {
              "name": "403 No API access, or the plan feature is missing",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"Recurring billing is not included in your plan\"\n}"
            },
            {
              "name": "404 No package with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Package not found\"\n}"
            }
          ]
        },
        {
          "name": "Update a package",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/packages/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "packages",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4p1a2b0001pkg0001abcd"
                }
              ]
            },
            "description": "Partial update of name, description, enabled, sortOrder and defaultProviderId. Unknown fields are rejected. Idempotency-Key is not used.\n\nReference: https://docs.centrapoint.co.za/reference#updatePackage",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"description\": \"Project management for teams\",\n  \"sortOrder\": 1\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 The updated package",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Project management for teams\",\n  \"sortOrder\": 1\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4p1a2b0001pkg0001abcd\",\n  \"object\": \"package\",\n  \"name\": \"Acme Cloud\",\n  \"description\": \"Hosted project management\",\n  \"enabled\": true,\n  \"sortOrder\": 0,\n  \"defaultProviderId\": \"cmg1p0v1d0001prov0001abcd\",\n  \"plans\": [\n    {\n      \"id\": \"cmg4p1a2b0002pln0001abcd\",\n      \"object\": \"plan\",\n      \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n      \"name\": \"Pro\",\n      \"description\": \"For growing teams\",\n      \"features\": [\n        \"Unlimited projects\",\n        \"Priority support\"\n      ],\n      \"hasCallToAction\": false,\n      \"callToActionUrl\": null,\n      \"hasContactUs\": false,\n      \"enabled\": true,\n      \"frequency\": \"monthly\",\n      \"amount\": 499,\n      \"setupFee\": 0,\n      \"currency\": \"ZAR\",\n      \"trialDays\": 14,\n      \"billingCycles\": null,\n      \"providerIds\": [],\n      \"sortOrder\": 1,\n      \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n      \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n    }\n  ],\n  \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Project management for teams\",\n  \"sortOrder\": 1\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Invalid body\"\n}"
            },
            {
              "name": "403 No API access, plan feature missing, or the account is read-only",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Project management for teams\",\n  \"sortOrder\": 1\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No package with this ID in your organisation",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"description\": \"Project management for teams\",\n  \"sortOrder\": 1\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Package not found\"\n}"
            }
          ]
        },
        {
          "name": "Disable a package",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/packages/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "packages",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4p1a2b0001pkg0001abcd"
                }
              ]
            },
            "description": "Disables the package (`enabled: false`) so it can't be subscribed to. Nothing is deleted and existing subscriptions keep billing. Re-enable it with PATCH.\n\nReference: https://docs.centrapoint.co.za/reference#disablePackage"
          },
          "response": [
            {
              "name": "200 The disabled package",
              "originalRequest": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4p1a2b0001pkg0001abcd\",\n  \"object\": \"package\",\n  \"name\": \"Acme Cloud\",\n  \"description\": \"Hosted project management\",\n  \"enabled\": false,\n  \"sortOrder\": 0,\n  \"defaultProviderId\": \"cmg1p0v1d0001prov0001abcd\",\n  \"plans\": [\n    {\n      \"id\": \"cmg4p1a2b0002pln0001abcd\",\n      \"object\": \"plan\",\n      \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n      \"name\": \"Pro\",\n      \"description\": \"For growing teams\",\n      \"features\": [\n        \"Unlimited projects\",\n        \"Priority support\"\n      ],\n      \"hasCallToAction\": false,\n      \"callToActionUrl\": null,\n      \"hasContactUs\": false,\n      \"enabled\": true,\n      \"frequency\": \"monthly\",\n      \"amount\": 499,\n      \"setupFee\": 0,\n      \"currency\": \"ZAR\",\n      \"trialDays\": 14,\n      \"billingCycles\": null,\n      \"providerIds\": [],\n      \"sortOrder\": 1,\n      \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n      \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n    }\n  ],\n  \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n}"
            },
            {
              "name": "403 No API access, plan feature missing, or the account is read-only",
              "originalRequest": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No package with this ID in your organisation",
              "originalRequest": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Package not found\"\n}"
            }
          ]
        },
        {
          "name": "Add a plan to a package",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/packages/:id/plans",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "packages",
                ":id",
                "plans"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4p1a2b0001pkg0001abcd"
                }
              ]
            },
            "description": "Creates a plan in the package. Requires the REST API and Recurring billing in your plan (`403 plan_restricted` otherwise).\n\nReference: https://docs.centrapoint.co.za/reference#createPlan",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Team (annual)\",\n  \"frequency\": \"annually\",\n  \"amount\": 4990,\n  \"setupFee\": 0,\n  \"trialDays\": 0,\n  \"features\": [\n    \"Up to 25 users\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 The new plan",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id/plans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id",
                    "plans"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Team (annual)\",\n  \"frequency\": \"annually\",\n  \"amount\": 4990,\n  \"setupFee\": 0,\n  \"trialDays\": 0,\n  \"features\": [\n    \"Up to 25 users\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4p1a2b0003pln0002abcd\",\n  \"object\": \"plan\",\n  \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n  \"name\": \"Team (annual)\",\n  \"description\": null,\n  \"features\": [\n    \"Up to 25 users\"\n  ],\n  \"hasCallToAction\": false,\n  \"callToActionUrl\": null,\n  \"hasContactUs\": false,\n  \"enabled\": true,\n  \"frequency\": \"annually\",\n  \"amount\": 4990,\n  \"setupFee\": 0,\n  \"currency\": \"ZAR\",\n  \"trialDays\": 0,\n  \"billingCycles\": null,\n  \"providerIds\": [],\n  \"sortOrder\": 1,\n  \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id/plans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id",
                    "plans"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Team (annual)\",\n  \"frequency\": \"annually\",\n  \"amount\": 4990,\n  \"setupFee\": 0,\n  \"trialDays\": 0,\n  \"features\": [\n    \"Up to 25 users\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"currency must be a 3-letter ISO code\"\n}"
            },
            {
              "name": "403 No API access, plan feature missing, or the account is read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id/plans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id",
                    "plans"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Team (annual)\",\n  \"frequency\": \"annually\",\n  \"amount\": 4990,\n  \"setupFee\": 0,\n  \"trialDays\": 0,\n  \"features\": [\n    \"Up to 25 users\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No package with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id/plans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id",
                    "plans"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Team (annual)\",\n  \"frequency\": \"annually\",\n  \"amount\": 4990,\n  \"setupFee\": 0,\n  \"trialDays\": 0,\n  \"features\": [\n    \"Up to 25 users\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Package not found\"\n}"
            },
            {
              "name": "409 Idempotency-Key reused with a different body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/packages/:id/plans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "packages",
                    ":id",
                    "plans"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0001pkg0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Team (annual)\",\n  \"frequency\": \"annually\",\n  \"amount\": 4990,\n  \"setupFee\": 0,\n  \"trialDays\": 0,\n  \"features\": [\n    \"Up to 25 users\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "List plans (find one by code)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/plans",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "plans"
              ],
              "query": [
                {
                  "key": "code",
                  "value": "acmehosting:pro:monthly",
                  "description": "Exact plan code.",
                  "disabled": true
                },
                {
                  "key": "packageId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "enabled",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "50",
                  "description": "1-100, default 50.",
                  "disabled": true
                }
              ]
            },
            "description": "Plans across your packages in sort order. `code` finds the plan with your code (at most one). Requires the REST API and Recurring billing in your plan (`403 plan_restricted` otherwise).\n\nReference: https://docs.centrapoint.co.za/reference#listPlans"
          },
          "response": [
            {
              "name": "403 No API access, or the plan feature is missing",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/plans",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "plans"
                  ],
                  "query": [
                    {
                      "key": "code",
                      "value": "acmehosting:pro:monthly",
                      "description": "Exact plan code.",
                      "disabled": true
                    },
                    {
                      "key": "packageId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "enabled",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "50",
                      "description": "1-100, default 50.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"Recurring billing is not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Get a plan",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/plans/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "plans",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4p1a2b0002pln0001abcd"
                }
              ]
            },
            "description": "One plan. Requires the REST API and Recurring billing in your plan (`403 plan_restricted` otherwise).\n\nReference: https://docs.centrapoint.co.za/reference#getPlan"
          },
          "response": [
            {
              "name": "200 The plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/plans/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "plans",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0002pln0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4p1a2b0002pln0001abcd\",\n  \"object\": \"plan\",\n  \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n  \"name\": \"Pro\",\n  \"description\": \"For growing teams\",\n  \"features\": [\n    \"Unlimited projects\",\n    \"Priority support\"\n  ],\n  \"hasCallToAction\": false,\n  \"callToActionUrl\": null,\n  \"hasContactUs\": false,\n  \"enabled\": true,\n  \"frequency\": \"monthly\",\n  \"amount\": 499,\n  \"setupFee\": 0,\n  \"currency\": \"ZAR\",\n  \"trialDays\": 14,\n  \"billingCycles\": null,\n  \"providerIds\": [],\n  \"sortOrder\": 1,\n  \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:00:00.000Z\",\n  \"code\": null\n}"
            },
            {
              "name": "403 No API access, or the plan feature is missing",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/plans/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "plans",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0002pln0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"Recurring billing is not included in your plan\"\n}"
            },
            {
              "name": "404 No plan with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/plans/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "plans",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0002pln0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Plan not found\"\n}"
            }
          ]
        },
        {
          "name": "Update a plan",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/plans/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "plans",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4p1a2b0002pln0001abcd"
                }
              ]
            },
            "description": "Partial update. Price and frequency changes apply to new subscriptions only: existing subscriptions keep their price until they change plan. `enabled: false` hides the plan from checkout. Idempotency-Key is not used.\n\nReference: https://docs.centrapoint.co.za/reference#updatePlan",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 549,\n  \"features\": [\n    \"Unlimited projects\",\n    \"Priority support\",\n    \"SSO\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 The updated plan",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/plans/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "plans",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0002pln0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 549,\n  \"features\": [\n    \"Unlimited projects\",\n    \"Priority support\",\n    \"SSO\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4p1a2b0002pln0001abcd\",\n  \"object\": \"plan\",\n  \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n  \"name\": \"Pro\",\n  \"description\": \"For growing teams\",\n  \"features\": [\n    \"Unlimited projects\",\n    \"Priority support\",\n    \"SSO\"\n  ],\n  \"hasCallToAction\": false,\n  \"callToActionUrl\": null,\n  \"hasContactUs\": false,\n  \"enabled\": true,\n  \"frequency\": \"monthly\",\n  \"amount\": 549,\n  \"setupFee\": 0,\n  \"currency\": \"ZAR\",\n  \"trialDays\": 14,\n  \"billingCycles\": null,\n  \"providerIds\": [],\n  \"sortOrder\": 1,\n  \"createdAt\": \"2026-09-28T08:00:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/plans/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "plans",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0002pln0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 549,\n  \"features\": [\n    \"Unlimited projects\",\n    \"Priority support\",\n    \"SSO\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Invalid body\"\n}"
            },
            {
              "name": "403 No API access, plan feature missing, or the account is read-only",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/plans/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "plans",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0002pln0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 549,\n  \"features\": [\n    \"Unlimited projects\",\n    \"Priority support\",\n    \"SSO\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No plan with this ID in your organisation",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/plans/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "plans",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4p1a2b0002pln0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 549,\n  \"features\": [\n    \"Unlimited projects\",\n    \"Priority support\",\n    \"SSO\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Plan not found\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Customer subscriptions",
      "description": "Customers subscribed to your plans: billed by invoice, gateway or debit order. Requires Recurring billing.\n\nDocs: https://docs.centrapoint.co.za/customer-subscriptions",
      "item": [
        {
          "name": "List customer subscriptions",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "Status, or a comma-separated list (e.g. `active,past_due`).",
                  "disabled": true
                },
                {
                  "key": "collectionMethod",
                  "value": "",
                  "description": "Collection method, or a comma-separated list (e.g. `external`, or `gateway,debit_order,invoice,manual` for what CentraPoint collects).",
                  "disabled": true
                },
                {
                  "key": "planId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "packageId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "customerId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "customerExternalReference",
                  "value": "",
                  "description": "Your id of the customer (Customer.externalReference).",
                  "disabled": true
                },
                {
                  "key": "externalReference",
                  "value": "",
                  "description": "Exact match on your subscription ID.",
                  "disabled": true
                },
                {
                  "key": "nextBillingFrom",
                  "value": "",
                  "description": "Next billing on or after (YYYY-MM-DD, SAST).",
                  "disabled": true
                },
                {
                  "key": "nextBillingTo",
                  "value": "",
                  "description": "Next billing on or before (YYYY-MM-DD, SAST).",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ]
            },
            "description": "Newest first, keyset paginated (`limit`, `startingAfter` -> `hasMore`, `nextCursor`). The response still has `data` as before. Requires the REST API and Recurring billing in your plan.\n\nReference: https://docs.centrapoint.co.za/reference#listCustomerSubscriptions"
          },
          "response": [
            {
              "name": "200 Subscriptions",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Status, or a comma-separated list (e.g. `active,past_due`).",
                      "disabled": true
                    },
                    {
                      "key": "collectionMethod",
                      "value": "",
                      "description": "Collection method, or a comma-separated list (e.g. `external`, or `gateway,debit_order,invoice,manual` for what CentraPoint collects).",
                      "disabled": true
                    },
                    {
                      "key": "planId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "packageId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerExternalReference",
                      "value": "",
                      "description": "Your id of the customer (Customer.externalReference).",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "Exact match on your subscription ID.",
                      "disabled": true
                    },
                    {
                      "key": "nextBillingFrom",
                      "value": "",
                      "description": "Next billing on or after (YYYY-MM-DD, SAST).",
                      "disabled": true
                    },
                    {
                      "key": "nextBillingTo",
                      "value": "",
                      "description": "Next billing on or before (YYYY-MM-DD, SAST).",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg4s9d8e0005csb0001abcd\",\n      \"object\": \"customer_subscription\",\n      \"status\": \"trialing\",\n      \"customer\": {\n        \"id\": \"cmg2c0s7t0003cust0001abcd\",\n        \"externalReference\": \"CRM-1001\",\n        \"email\": \"thandi@example.co.za\"\n      },\n      \"plan\": {\n        \"id\": \"cmg4p1a2b0002pln0001abcd\",\n        \"name\": \"Pro\",\n        \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n        \"packageName\": \"Acme Cloud\"\n      },\n      \"collectionMethod\": \"invoice\",\n      \"quantity\": 1,\n      \"amount\": 499,\n      \"currency\": \"ZAR\",\n      \"frequency\": \"monthly\",\n      \"billingCycles\": null,\n      \"cyclesBilled\": 0,\n      \"startedAt\": \"2026-09-28T08:10:00.000Z\",\n      \"trialEndsAt\": \"2026-10-12T08:10:00.000Z\",\n      \"currentPeriodStart\": null,\n      \"currentPeriodEnd\": null,\n      \"nextBillingAt\": \"2026-10-12T08:10:00.000Z\",\n      \"endsAt\": null,\n      \"cancelAtPeriodEnd\": false,\n      \"cancelledAt\": null,\n      \"cancelReason\": null,\n      \"pausedAt\": null,\n      \"resumedAt\": null,\n      \"dunningAttempts\": 0,\n      \"gateway\": null,\n      \"providerId\": null,\n      \"paymentTokenId\": null,\n      \"couponId\": null,\n      \"externalReference\": \"SUB-CRM-1001-PRO\",\n      \"metadata\": {\n        \"crmDealId\": \"D-778\"\n      },\n      \"source\": \"api\",\n      \"createdAt\": \"2026-09-28T08:10:00.000Z\",\n      \"updatedAt\": \"2026-09-28T08:10:00.000Z\"\n    }\n  ],\n  \"hasMore\": false,\n  \"nextCursor\": null\n}"
            },
            {
              "name": "400 Invalid status",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Status, or a comma-separated list (e.g. `active,past_due`).",
                      "disabled": true
                    },
                    {
                      "key": "collectionMethod",
                      "value": "",
                      "description": "Collection method, or a comma-separated list (e.g. `external`, or `gateway,debit_order,invoice,manual` for what CentraPoint collects).",
                      "disabled": true
                    },
                    {
                      "key": "planId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "packageId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerExternalReference",
                      "value": "",
                      "description": "Your id of the customer (Customer.externalReference).",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "Exact match on your subscription ID.",
                      "disabled": true
                    },
                    {
                      "key": "nextBillingFrom",
                      "value": "",
                      "description": "Next billing on or after (YYYY-MM-DD, SAST).",
                      "disabled": true
                    },
                    {
                      "key": "nextBillingTo",
                      "value": "",
                      "description": "Next billing on or before (YYYY-MM-DD, SAST).",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"status must be one of incomplete, trialing, active, past_due, paused, cancelled, expired\"\n}"
            },
            {
              "name": "403 No API access, or the plan feature is missing",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Status, or a comma-separated list (e.g. `active,past_due`).",
                      "disabled": true
                    },
                    {
                      "key": "collectionMethod",
                      "value": "",
                      "description": "Collection method, or a comma-separated list (e.g. `external`, or `gateway,debit_order,invoice,manual` for what CentraPoint collects).",
                      "disabled": true
                    },
                    {
                      "key": "planId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "packageId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerExternalReference",
                      "value": "",
                      "description": "Your id of the customer (Customer.externalReference).",
                      "disabled": true
                    },
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "Exact match on your subscription ID.",
                      "disabled": true
                    },
                    {
                      "key": "nextBillingFrom",
                      "value": "",
                      "description": "Next billing on or after (YYYY-MM-DD, SAST).",
                      "disabled": true
                    },
                    {
                      "key": "nextBillingTo",
                      "value": "",
                      "description": "Next billing on or before (YYYY-MM-DD, SAST).",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"Recurring billing is not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Subscribe a customer to a plan",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions"
              ]
            },
            "description": "Creates a subscription (201). With a trial it starts `trialing`; otherwise `incomplete` until the first payment (setup fee + first period) completes, then `active`. A zero first charge activates at once. `payment` says what is due now and where the customer pays (`payUrl`). With an `externalReference` that already exists, the existing subscription is returned with 200 and its current payment state. Unless one side is an external (mirror) subscription and the other is not, or the existing one belongs to another customer: then `409 external_reference_conflict`. Requires the REST API and Recurring billing in your plan (`403 plan_restricted` otherwise). `collectionMethod: external` records a subscription your platform bills (mirror import): nothing is charged, emailed or sent as a webhook, `payment.due` is false and `collectedByCentraPoint` is false. `dryRun: true` validates the same way and answers 200 with `CustomerSubscriptionDryRun` without writing anything. The `externalReference` is unique per organisation, also for two requests at the same time (the second gets 200 and the first one's subscription).\n\nReference: https://docs.centrapoint.co.za/reference#createCustomerSubscription",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"customer\": {\n    \"externalReference\": \"acmehosting:user:1042\"\n  },\n  \"plan\": \"acmehosting:pro:monthly\",\n  \"collectionMethod\": \"external\",\n  \"paidThrough\": \"2026-10-31\",\n  \"externalReference\": \"acmehosting-sub:1042\",\n  \"sendEmail\": false,\n  \"dryRun\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 Created (`created: true`)",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"acmehosting:user:1042\"\n  },\n  \"plan\": \"acmehosting:pro:monthly\",\n  \"collectionMethod\": \"external\",\n  \"paidThrough\": \"2026-10-31\",\n  \"externalReference\": \"acmehosting-sub:1042\",\n  \"sendEmail\": false,\n  \"dryRun\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4s9d8e0005csb0001abcd\",\n  \"object\": \"customer_subscription\",\n  \"status\": \"trialing\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"plan\": {\n    \"id\": \"cmg4p1a2b0002pln0001abcd\",\n    \"name\": \"Pro\",\n    \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n    \"packageName\": \"Acme Cloud\"\n  },\n  \"collectionMethod\": \"invoice\",\n  \"quantity\": 1,\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"frequency\": \"monthly\",\n  \"billingCycles\": null,\n  \"cyclesBilled\": 0,\n  \"startedAt\": \"2026-09-28T08:10:00.000Z\",\n  \"trialEndsAt\": \"2026-10-12T08:10:00.000Z\",\n  \"currentPeriodStart\": null,\n  \"currentPeriodEnd\": null,\n  \"nextBillingAt\": \"2026-10-12T08:10:00.000Z\",\n  \"endsAt\": null,\n  \"cancelAtPeriodEnd\": false,\n  \"cancelledAt\": null,\n  \"cancelReason\": null,\n  \"pausedAt\": null,\n  \"resumedAt\": null,\n  \"dunningAttempts\": 0,\n  \"gateway\": null,\n  \"providerId\": null,\n  \"paymentTokenId\": null,\n  \"couponId\": null,\n  \"externalReference\": \"SUB-CRM-1001-PRO\",\n  \"metadata\": {\n    \"crmDealId\": \"D-778\"\n  },\n  \"source\": \"api\",\n  \"createdAt\": \"2026-09-28T08:10:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:10:00.000Z\",\n  \"payment\": {\n    \"due\": false,\n    \"amount\": 0,\n    \"currency\": \"ZAR\",\n    \"method\": \"none\",\n    \"payUrl\": null,\n    \"invoiceId\": null,\n    \"paymentLinkId\": null,\n    \"transactionId\": null\n  },\n  \"created\": true\n}"
            },
            {
              "name": "400 Validation failed: customer/plan/mandate/provider not found, inactive customer, disabled plan, invalid coupon, unsup",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"acmehosting:user:1042\"\n  },\n  \"plan\": \"acmehosting:pro:monthly\",\n  \"collectionMethod\": \"external\",\n  \"paidThrough\": \"2026-10-31\",\n  \"externalReference\": \"acmehosting-sub:1042\",\n  \"sendEmail\": false,\n  \"dryRun\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"This plan is not available\"\n}"
            },
            {
              "name": "403 `plan_restricted`: no REST API or Recurring billing",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"acmehosting:user:1042\"\n  },\n  \"plan\": \"acmehosting:pro:monthly\",\n  \"collectionMethod\": \"external\",\n  \"paidThrough\": \"2026-10-31\",\n  \"externalReference\": \"acmehosting-sub:1042\",\n  \"sendEmail\": false,\n  \"dryRun\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_limit\",\n  \"message\": \"Debit orders is not included in the Growth plan. Upgrade under Settings > Billing.\"\n}"
            },
            {
              "name": "409 idempotencyConflict",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"acmehosting:user:1042\"\n  },\n  \"plan\": \"acmehosting:pro:monthly\",\n  \"collectionMethod\": \"external\",\n  \"paidThrough\": \"2026-10-31\",\n  \"externalReference\": \"acmehosting-sub:1042\",\n  \"sendEmail\": false,\n  \"dryRun\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            },
            {
              "name": "409 externalReferenceConflict",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"acmehosting:user:1042\"\n  },\n  \"plan\": \"acmehosting:pro:monthly\",\n  \"collectionMethod\": \"external\",\n  \"paidThrough\": \"2026-10-31\",\n  \"externalReference\": \"acmehosting-sub:1042\",\n  \"sendEmail\": false,\n  \"dryRun\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"external_reference_conflict\",\n  \"message\": \"externalReference acmehosting-sub:1042 belongs to a subscription with collectionMethod external, not invoice. To let CentraPoint bill it, cancel that record and create the new subscription with its own externalReference.\"\n}"
            },
            {
              "name": "409 externalImportsUnavailable",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"acmehosting:user:1042\"\n  },\n  \"plan\": \"acmehosting:pro:monthly\",\n  \"collectionMethod\": \"external\",\n  \"paidThrough\": \"2026-10-31\",\n  \"externalReference\": \"acmehosting-sub:1042\",\n  \"sendEmail\": false,\n  \"dryRun\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"external_imports_unavailable\",\n  \"message\": \"CentraPoint is being updated, so it does not accept subscriptions your platform bills (collectionMethod external) now. Nothing was written: try again later (GET /api/v1/me says capabilities.externalSubscriptions: true once it does).\"\n}"
            }
          ]
        },
        {
          "name": "Get a customer subscription",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id"
              ],
              "query": [
                {
                  "key": "include",
                  "value": "",
                  "description": "`events` adds the event timeline.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4s9d8e0005csb0001abcd"
                }
              ]
            },
            "description": "Add `?include=events` for the timeline (latest 100 events). Requires the REST API and Recurring billing in your plan (`403 plan_restricted` otherwise).\n\nReference: https://docs.centrapoint.co.za/reference#getCustomerSubscription"
          },
          "response": [
            {
              "name": "200 The subscription",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id"
                  ],
                  "query": [
                    {
                      "key": "include",
                      "value": "",
                      "description": "`events` adds the event timeline.",
                      "disabled": true
                    }
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4s9d8e0005csb0001abcd\",\n  \"object\": \"customer_subscription\",\n  \"status\": \"trialing\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"plan\": {\n    \"id\": \"cmg4p1a2b0002pln0001abcd\",\n    \"name\": \"Pro\",\n    \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n    \"packageName\": \"Acme Cloud\"\n  },\n  \"collectionMethod\": \"invoice\",\n  \"quantity\": 1,\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"frequency\": \"monthly\",\n  \"billingCycles\": null,\n  \"cyclesBilled\": 0,\n  \"startedAt\": \"2026-09-28T08:10:00.000Z\",\n  \"trialEndsAt\": \"2026-10-12T08:10:00.000Z\",\n  \"currentPeriodStart\": null,\n  \"currentPeriodEnd\": null,\n  \"nextBillingAt\": \"2026-10-12T08:10:00.000Z\",\n  \"endsAt\": null,\n  \"cancelAtPeriodEnd\": false,\n  \"cancelledAt\": null,\n  \"cancelReason\": null,\n  \"pausedAt\": null,\n  \"resumedAt\": null,\n  \"dunningAttempts\": 0,\n  \"gateway\": null,\n  \"providerId\": null,\n  \"paymentTokenId\": null,\n  \"couponId\": null,\n  \"externalReference\": \"SUB-CRM-1001-PRO\",\n  \"metadata\": {\n    \"crmDealId\": \"D-778\"\n  },\n  \"source\": \"api\",\n  \"createdAt\": \"2026-09-28T08:10:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:10:00.000Z\"\n}"
            },
            {
              "name": "403 No API access, or the plan feature is missing",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id"
                  ],
                  "query": [
                    {
                      "key": "include",
                      "value": "",
                      "description": "`events` adds the event timeline.",
                      "disabled": true
                    }
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"Recurring billing is not included in your plan\"\n}"
            },
            {
              "name": "404 No subscription with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id"
                  ],
                  "query": [
                    {
                      "key": "include",
                      "value": "",
                      "description": "`events` adds the event timeline.",
                      "disabled": true
                    }
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Subscription not found\"\n}"
            }
          ]
        },
        {
          "name": "Update a customer subscription",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4s9d8e0005csb0001abcd"
                }
              ]
            },
            "description": "Changes `metadata`, `externalReference` or `nextBillingAt`. Sends `subscription.updated`. Unknown fields are rejected. Idempotency-Key is not used.\n\nReference: https://docs.centrapoint.co.za/reference#updateCustomerSubscription",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"nextBillingAt\": \"2026-10-15T08:00:00+02:00\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 The updated subscription",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"nextBillingAt\": \"2026-10-15T08:00:00+02:00\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4s9d8e0005csb0001abcd\",\n  \"object\": \"customer_subscription\",\n  \"status\": \"trialing\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"plan\": {\n    \"id\": \"cmg4p1a2b0002pln0001abcd\",\n    \"name\": \"Pro\",\n    \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n    \"packageName\": \"Acme Cloud\"\n  },\n  \"collectionMethod\": \"invoice\",\n  \"quantity\": 1,\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"frequency\": \"monthly\",\n  \"billingCycles\": null,\n  \"cyclesBilled\": 0,\n  \"startedAt\": \"2026-09-28T08:10:00.000Z\",\n  \"trialEndsAt\": \"2026-10-15T06:00:00.000Z\",\n  \"currentPeriodStart\": null,\n  \"currentPeriodEnd\": null,\n  \"nextBillingAt\": \"2026-10-15T06:00:00.000Z\",\n  \"endsAt\": null,\n  \"cancelAtPeriodEnd\": false,\n  \"cancelledAt\": null,\n  \"cancelReason\": null,\n  \"pausedAt\": null,\n  \"resumedAt\": null,\n  \"dunningAttempts\": 0,\n  \"gateway\": null,\n  \"providerId\": null,\n  \"paymentTokenId\": null,\n  \"couponId\": null,\n  \"externalReference\": \"SUB-CRM-1001-PRO\",\n  \"metadata\": {\n    \"crmDealId\": \"D-778\"\n  },\n  \"source\": \"api\",\n  \"createdAt\": \"2026-09-28T08:10:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:10:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"nextBillingAt\": \"2026-10-15T08:00:00+02:00\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Debit order dates follow the mandate's debit day - edit the mandate instead\"\n}"
            },
            {
              "name": "403 No API access, plan feature missing, or the account is read-only",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"nextBillingAt\": \"2026-10-15T08:00:00+02:00\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No subscription with this ID in your organisation",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"nextBillingAt\": \"2026-10-15T08:00:00+02:00\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Subscription not found\"\n}"
            }
          ]
        },
        {
          "name": "Pause a customer subscription",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/pause",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "pause"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4s9d8e0005csb0001abcd"
                }
              ]
            },
            "description": "Stops billing until resumed. Allowed from `active` or `past_due`; pausing a paused subscription returns it unchanged. Linked debit order mandates are paused too; gateway-billed subscriptions are paused at the gateway first (PayFast), and gateways that can't pause (Netcash Pay Now) return 400. Sends `subscription.paused`. No body.\n\nReference: https://docs.centrapoint.co.za/reference#pauseCustomerSubscription"
          },
          "response": [
            {
              "name": "200 The subscription after the pause",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4s9d8e0005csb0001abcd\",\n  \"object\": \"customer_subscription\",\n  \"status\": \"paused\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"plan\": {\n    \"id\": \"cmg4p1a2b0002pln0001abcd\",\n    \"name\": \"Pro\",\n    \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n    \"packageName\": \"Acme Cloud\"\n  },\n  \"collectionMethod\": \"invoice\",\n  \"quantity\": 1,\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"frequency\": \"monthly\",\n  \"billingCycles\": null,\n  \"cyclesBilled\": 0,\n  \"startedAt\": \"2026-09-28T08:10:00.000Z\",\n  \"trialEndsAt\": \"2026-10-12T08:10:00.000Z\",\n  \"currentPeriodStart\": null,\n  \"currentPeriodEnd\": null,\n  \"nextBillingAt\": \"2026-10-12T08:10:00.000Z\",\n  \"endsAt\": null,\n  \"cancelAtPeriodEnd\": false,\n  \"cancelledAt\": null,\n  \"cancelReason\": null,\n  \"pausedAt\": \"2026-11-02T09:00:00.000Z\",\n  \"resumedAt\": null,\n  \"dunningAttempts\": 0,\n  \"gateway\": null,\n  \"providerId\": null,\n  \"paymentTokenId\": null,\n  \"couponId\": null,\n  \"externalReference\": \"SUB-CRM-1001-PRO\",\n  \"metadata\": {\n    \"crmDealId\": \"D-778\"\n  },\n  \"source\": \"api\",\n  \"createdAt\": \"2026-09-28T08:10:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:10:00.000Z\"\n}"
            },
            {
              "name": "400 Not allowed from the current status, or the gateway refused",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Only active subscriptions can be paused (this one is trialing)\"\n}"
            },
            {
              "name": "403 No API access, plan feature missing, or the account is read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No subscription with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Subscription not found\"\n}"
            },
            {
              "name": "409 external",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"external_subscription\",\n  \"message\": \"Billed by Acme Hosting: CentraPoint only records this subscription and cannot pause it. Pause it on the platform and sync its status.\"\n}"
            }
          ]
        },
        {
          "name": "Resume a customer subscription",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/resume",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "resume"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4s9d8e0005csb0001abcd"
                }
              ]
            },
            "description": "Resumes a paused subscription (resuming an active one returns it unchanged). Billing restarts at the end of the already-paid period, or now if it has passed; the status returns to `active` (or `past_due` / `incomplete` if it was). Sends `subscription.resumed`. No body.\n\nReference: https://docs.centrapoint.co.za/reference#resumeCustomerSubscription"
          },
          "response": [
            {
              "name": "200 The subscription after the resume",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4s9d8e0005csb0001abcd\",\n  \"object\": \"customer_subscription\",\n  \"status\": \"active\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"plan\": {\n    \"id\": \"cmg4p1a2b0002pln0001abcd\",\n    \"name\": \"Pro\",\n    \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n    \"packageName\": \"Acme Cloud\"\n  },\n  \"collectionMethod\": \"invoice\",\n  \"quantity\": 1,\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"frequency\": \"monthly\",\n  \"billingCycles\": null,\n  \"cyclesBilled\": 0,\n  \"startedAt\": \"2026-09-28T08:10:00.000Z\",\n  \"trialEndsAt\": \"2026-10-12T08:10:00.000Z\",\n  \"currentPeriodStart\": null,\n  \"currentPeriodEnd\": null,\n  \"nextBillingAt\": \"2026-10-12T08:10:00.000Z\",\n  \"endsAt\": null,\n  \"cancelAtPeriodEnd\": false,\n  \"cancelledAt\": null,\n  \"cancelReason\": null,\n  \"pausedAt\": null,\n  \"resumedAt\": \"2026-11-10T09:00:00.000Z\",\n  \"dunningAttempts\": 0,\n  \"gateway\": null,\n  \"providerId\": null,\n  \"paymentTokenId\": null,\n  \"couponId\": null,\n  \"externalReference\": \"SUB-CRM-1001-PRO\",\n  \"metadata\": {\n    \"crmDealId\": \"D-778\"\n  },\n  \"source\": \"api\",\n  \"createdAt\": \"2026-09-28T08:10:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:10:00.000Z\"\n}"
            },
            {
              "name": "400 Not allowed from the current status, or the gateway refused",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Only active subscriptions can be paused (this one is trialing)\"\n}"
            },
            {
              "name": "403 No API access, plan feature missing, or the account is read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No subscription with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Subscription not found\"\n}"
            },
            {
              "name": "409 external",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"external_subscription\",\n  \"message\": \"Billed by Acme Hosting: CentraPoint only records this subscription and cannot pause it. Pause it on the platform and sync its status.\"\n}"
            }
          ]
        },
        {
          "name": "Cancel a customer subscription",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "cancel"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4s9d8e0005csb0001abcd"
                }
              ]
            },
            "description": "Cancels now, or with `atPeriodEnd: true` at the end of the paid period (trial end for trials). Gateway billing is stopped at the gateway first; if the gateway refuses, nothing changes (400). Cancelling a cancelled or expired subscription returns it unchanged. Immediate cancellation sends `subscription.cancelled` (and cancels unpaid first invoices of incomplete/trialing subscriptions); a scheduled one sends `subscription.updated` with `cancelAtPeriodEnd: true`. `sendEmail: false` cancels without emailing the customer; external subscriptions are always cancelled silently.\n\nReference: https://docs.centrapoint.co.za/reference#cancelCustomerSubscription",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"atPeriodEnd\": true,\n  \"reason\": \"Moving to another provider\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 The subscription after the cancellation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"atPeriodEnd\": true,\n  \"reason\": \"Moving to another provider\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4s9d8e0005csb0001abcd\",\n  \"object\": \"customer_subscription\",\n  \"status\": \"active\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"plan\": {\n    \"id\": \"cmg4p1a2b0002pln0001abcd\",\n    \"name\": \"Pro\",\n    \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n    \"packageName\": \"Acme Cloud\"\n  },\n  \"collectionMethod\": \"invoice\",\n  \"quantity\": 1,\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"frequency\": \"monthly\",\n  \"billingCycles\": null,\n  \"cyclesBilled\": 0,\n  \"startedAt\": \"2026-09-28T08:10:00.000Z\",\n  \"trialEndsAt\": \"2026-10-12T08:10:00.000Z\",\n  \"currentPeriodStart\": null,\n  \"currentPeriodEnd\": null,\n  \"nextBillingAt\": null,\n  \"endsAt\": \"2026-11-12T08:10:00.000Z\",\n  \"cancelAtPeriodEnd\": true,\n  \"cancelledAt\": null,\n  \"cancelReason\": \"Moving to another provider\",\n  \"pausedAt\": null,\n  \"resumedAt\": null,\n  \"dunningAttempts\": 0,\n  \"gateway\": null,\n  \"providerId\": null,\n  \"paymentTokenId\": null,\n  \"couponId\": null,\n  \"externalReference\": \"SUB-CRM-1001-PRO\",\n  \"metadata\": {\n    \"crmDealId\": \"D-778\"\n  },\n  \"source\": \"api\",\n  \"createdAt\": \"2026-09-28T08:10:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:10:00.000Z\"\n}"
            },
            {
              "name": "400 Not allowed from the current status, or the gateway refused",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"atPeriodEnd\": true,\n  \"reason\": \"Moving to another provider\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"PayFast did not accept the cancellation. The subscription was not cancelled.\"\n}"
            },
            {
              "name": "403 No API access, plan feature missing, or the account is read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"atPeriodEnd\": true,\n  \"reason\": \"Moving to another provider\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No subscription with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"atPeriodEnd\": true,\n  \"reason\": \"Moving to another provider\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Subscription not found\"\n}"
            }
          ]
        },
        {
          "name": "Change plan",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/change-plan",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "change-plan"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4s9d8e0005csb0001abcd"
                }
              ]
            },
            "description": "Changes plan, quantity and/or the recurring add-on items. `proration`: `none` (default, backwards compatible: new price from the next renewal), `now` (charge or credit the rest of the period; a frequency change starts a new period now), `next_renewal` (scheduled, see `pendingChange`). Gateways that bill the card themselves change the amount in place when they can (PayFast), otherwise the change is refused (use POST /api/v1/subscriptions/{id}/update to replace the card subscription). Sends `subscription.plan_changed` (or `subscription.updated` for items / scheduled changes) with `invoiceId` of any proration invoice. External subscriptions: the change is recorded without proration (`proration` is always `none`, nothing is charged) and may move to disabled plans.\n\nReference: https://docs.centrapoint.co.za/reference#changeCustomerSubscriptionPlan",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"planId\": \"cmg4p1a2b0003pln0001abcd\",\n  \"items\": [\n    {\n      \"code\": \"website_alias\",\n      \"description\": \"Website alias\",\n      \"unitAmount\": 250,\n      \"quantity\": 3\n    }\n  ],\n  \"proration\": \"now\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 The subscription after the plan change",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/change-plan",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "change-plan"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"planId\": \"cmg4p1a2b0003pln0001abcd\",\n  \"items\": [\n    {\n      \"code\": \"website_alias\",\n      \"description\": \"Website alias\",\n      \"unitAmount\": 250,\n      \"quantity\": 3\n    }\n  ],\n  \"proration\": \"now\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4s9d8e0005csb0001abcd\",\n  \"object\": \"customer_subscription\",\n  \"status\": \"trialing\",\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\",\n    \"email\": \"thandi@example.co.za\"\n  },\n  \"plan\": {\n    \"id\": \"cmg4p1a2b0003pln0002abcd\",\n    \"name\": \"Team (annual)\",\n    \"packageId\": \"cmg4p1a2b0001pkg0001abcd\",\n    \"packageName\": \"Acme Cloud\"\n  },\n  \"collectionMethod\": \"invoice\",\n  \"quantity\": 1,\n  \"amount\": 4990,\n  \"currency\": \"ZAR\",\n  \"frequency\": \"annually\",\n  \"billingCycles\": null,\n  \"cyclesBilled\": 0,\n  \"startedAt\": \"2026-09-28T08:10:00.000Z\",\n  \"trialEndsAt\": \"2026-10-12T08:10:00.000Z\",\n  \"currentPeriodStart\": null,\n  \"currentPeriodEnd\": null,\n  \"nextBillingAt\": \"2026-10-12T08:10:00.000Z\",\n  \"endsAt\": null,\n  \"cancelAtPeriodEnd\": false,\n  \"cancelledAt\": null,\n  \"cancelReason\": null,\n  \"pausedAt\": null,\n  \"resumedAt\": null,\n  \"dunningAttempts\": 0,\n  \"gateway\": null,\n  \"providerId\": null,\n  \"paymentTokenId\": null,\n  \"couponId\": null,\n  \"externalReference\": \"SUB-CRM-1001-PRO\",\n  \"metadata\": {\n    \"crmDealId\": \"D-778\"\n  },\n  \"source\": \"api\",\n  \"createdAt\": \"2026-09-28T08:10:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:10:00.000Z\"\n}"
            },
            {
              "name": "400 Not allowed from the current status, or the gateway refused",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/change-plan",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "change-plan"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"planId\": \"cmg4p1a2b0003pln0001abcd\",\n  \"items\": [\n    {\n      \"code\": \"website_alias\",\n      \"description\": \"Website alias\",\n      \"unitAmount\": 250,\n      \"quantity\": 3\n    }\n  ],\n  \"proration\": \"now\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"The new plan is billed in USD, the subscription in ZAR\"\n}"
            },
            {
              "name": "403 No API access, plan feature missing, or the account is read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/change-plan",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "change-plan"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"planId\": \"cmg4p1a2b0003pln0001abcd\",\n  \"items\": [\n    {\n      \"code\": \"website_alias\",\n      \"description\": \"Website alias\",\n      \"unitAmount\": 250,\n      \"quantity\": 3\n    }\n  ],\n  \"proration\": \"now\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No subscription with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/change-plan",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "change-plan"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4s9d8e0005csb0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"planId\": \"cmg4p1a2b0003pln0001abcd\",\n  \"items\": [\n    {\n      \"code\": \"website_alias\",\n      \"description\": \"Website alias\",\n      \"unitAmount\": 250,\n      \"quantity\": 3\n    }\n  ],\n  \"proration\": \"now\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Subscription not found\"\n}"
            }
          ]
        },
        {
          "name": "Preview a change",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/preview-change",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "preview-change"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Same body as change-plan; nothing changes. Returns the current and new per-cycle amounts (subtotal, tax, total), the proration invoice (lines with billing periods, whether it is due now) and the next renewal invoice.\n\nReference: https://docs.centrapoint.co.za/reference#previewCustomerSubscriptionChange",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"quantity\": 5,\n  \"proration\": \"now\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Reactivate a subscription",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/reactivate",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "reactivate"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Reactivates a cancelled or expired subscription (or undoes a scheduled cancellation). Billing resumes on `nextBillingAt` (default now; the next billing run issues the charge, or `chargeNow: true` bills immediately). A subscription that never paid starts again as incomplete with a new first charge. Sends `subscription.reactivated`. External subscriptions are reactivated silently (no charge, email or webhook; `chargeNow` is refused with 409 `external_subscription`); then record the period with sync-period.\n\nReference: https://docs.centrapoint.co.za/reference#reactivateCustomerSubscription",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "409 external",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/reactivate",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "reactivate"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": ""
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"external_subscription\",\n  \"message\": \"Billed by Acme Hosting: CentraPoint only records this subscription and cannot pause it. Pause it on the platform and sync its status.\"\n}"
            }
          ]
        },
        {
          "name": "Record your platform's period (external subscriptions)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/sync-period",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "sync-period"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "For `collectionMethod: external` subscriptions only: records your platform's current period and status after its own renewal or status change. A period that starts where the recorded one ended counts as a renewal (`cyclesBilled` + 1); sending the recorded period and status again changes nothing. A scheduled cancellation moves to the new period end. A period that starts and ends before the recorded one with the same status is refused with `409 stale_period` (an older update arriving late); keep the recorded start to correct the current period. Two identical calls at the same time record one renewal. Nothing is charged, emailed or sent as a webhook.\n\nReference: https://docs.centrapoint.co.za/reference#syncCustomerSubscriptionPeriod",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"currentPeriodStart\": \"2026-10-31\",\n  \"currentPeriodEnd\": \"2026-11-30\",\n  \"status\": \"active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "409 notExternal",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/sync-period",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "sync-period"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": ""
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"currentPeriodStart\": \"2026-10-31\",\n  \"currentPeriodEnd\": \"2026-11-30\",\n  \"status\": \"active\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_external\",\n  \"message\": \"sync-period is only for subscriptions with collectionMethod external: CentraPoint bills this one itself\"\n}"
            },
            {
              "name": "409 stalePeriod",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/sync-period",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "sync-period"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": ""
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"currentPeriodStart\": \"2026-10-31\",\n  \"currentPeriodEnd\": \"2026-11-30\",\n  \"status\": \"active\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"stale_period\",\n  \"message\": \"The recorded period (2026-10-31T04:00:00.000Z to 2026-11-30T04:00:00.000Z) is later than this one, so this looks like an older update that arrived late. Nothing changed.\"\n}"
            },
            {
              "name": "409 concurrentUpdate",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/sync-period",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "sync-period"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": ""
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"currentPeriodStart\": \"2026-10-31\",\n  \"currentPeriodEnd\": \"2026-11-30\",\n  \"status\": \"active\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"concurrent_update\",\n  \"message\": \"The subscription kept changing while this sync-period was applied (other updates at the same time). Nothing changed: send it again.\"\n}"
            }
          ]
        },
        {
          "name": "Add credit",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/credit",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "credit"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Credit (price-list amount) taken off the next charge(s); credit left over carries to later charges. Sends `subscription.updated`.\n\nReference: https://docs.centrapoint.co.za/reference#creditCustomerSubscription",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 150,\n  \"description\": \"Downtime credit\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "409 external",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/credit",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "credit"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": ""
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 150,\n  \"description\": \"Downtime credit\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"external_subscription\",\n  \"message\": \"Billed by Acme Hosting: CentraPoint only records this subscription and cannot pause it. Pause it on the platform and sync its status.\"\n}"
            }
          ]
        },
        {
          "name": "Discount the next renewal",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/discount",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "discount"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "One-off discount on the next renewal: `percent` of the recurring amount, or a fixed `amount`.\n\nReference: https://docs.centrapoint.co.za/reference#discountCustomerSubscription",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"percent\": 20\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "409 external",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/discount",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "discount"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": ""
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"percent\": 20\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"external_subscription\",\n  \"message\": \"Billed by Acme Hosting: CentraPoint only records this subscription and cannot pause it. Pause it on the platform and sync its status.\"\n}"
            }
          ]
        },
        {
          "name": "Cancel a scheduled change",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/pending-change",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "pending-change"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Drops the change scheduled for the next renewal.\n\nReference: https://docs.centrapoint.co.za/reference#cancelCustomerSubscriptionPendingChange"
          },
          "response": []
        },
        {
          "name": "List items",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/items",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "items"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Live lines: add-ons, metered lines and one-time lines not billed yet.\n\nReference: https://docs.centrapoint.co.za/reference#listCustomerSubscriptionItems"
          },
          "response": []
        },
        {
          "name": "Add an item",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/items",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "items"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "`one_time` lines go on the next charge. Recurring lines change the per-cycle amount; `proration` as for change-plan.\n\nReference: https://docs.centrapoint.co.za/reference#addCustomerSubscriptionItem",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"code\": \"website_alias\",\n  \"description\": \"Website alias\",\n  \"unitAmount\": 250,\n  \"quantity\": 3,\n  \"proration\": \"now\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "409 external",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/items",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "customer-subscriptions",
                    ":id",
                    "items"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": ""
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"code\": \"website_alias\",\n  \"description\": \"Website alias\",\n  \"unitAmount\": 250,\n  \"quantity\": 3,\n  \"proration\": \"now\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"external_subscription\",\n  \"message\": \"Billed by Acme Hosting: CentraPoint only records this subscription and cannot pause it. Pause it on the platform and sync its status.\"\n}"
            }
          ]
        },
        {
          "name": "Replace the recurring items",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/items",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "items"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Sets the complete list of recurring (addon / metered) lines; matched by `code` (metered usage kept).\n\nReference: https://docs.centrapoint.co.za/reference#replaceCustomerSubscriptionItems",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"items\": [\n    {\n      \"description\": \"string\",\n      \"unitAmount\": 1,\n      \"quantity\": 1,\n      \"kind\": \"addon\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Update an item",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/items/:itemId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "items",
                ":itemId"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                },
                {
                  "key": "itemId",
                  "value": "",
                  "description": "Item id or its `code`."
                }
              ]
            },
            "description": "Change description, unitAmount or quantity (with `proration`).\n\nReference: https://docs.centrapoint.co.za/reference#updateCustomerSubscriptionItem",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Remove an item",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/items/:itemId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "items",
                ":itemId"
              ],
              "query": [
                {
                  "key": "proration",
                  "value": "",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                },
                {
                  "key": "itemId",
                  "value": "",
                  "description": "Item id or its `code`."
                }
              ]
            },
            "description": "Query `proration` = none (default) | now | next_renewal.\n\nReference: https://docs.centrapoint.co.za/reference#removeCustomerSubscriptionItem"
          },
          "response": []
        },
        {
          "name": "Record metered usage",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/items/:itemId/usage",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "items",
                ":itemId",
                "usage"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                },
                {
                  "key": "itemId",
                  "value": "",
                  "description": "Item id or its `code`."
                }
              ]
            },
            "description": "Adds (`increment`, default) or sets usage of a metered item for the current period. Billed at the next renewal, then reset. Send an Idempotency-Key to avoid double counting on retries.\n\nReference: https://docs.centrapoint.co.za/reference#recordCustomerSubscriptionUsage",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"quantity\": 120\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "List a subscription's invoices",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/invoices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "invoices"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Newest first. Each invoice has the fields of GET /api/v1/invoices/{id} (billing period as inclusive `YYYY-MM-DD` dates, lines with `details` and their own periods), plus `charge` and `cycle`.\n\nReference: https://docs.centrapoint.co.za/reference#listCustomerSubscriptionInvoices"
          },
          "response": []
        },
        {
          "name": "List a subscription's payments",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/customer-subscriptions/:id/payments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "customer-subscriptions",
                ":id",
                "payments"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Payment attempts (transactions), newest first. Filter with `status`.\n\nReference: https://docs.centrapoint.co.za/reference#listCustomerSubscriptionPayments"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Subscriptions",
      "description": "Gateway-managed card subscriptions started by recurring payment links (PayFast, Netcash Pay Now).\n\nDocs: https://docs.centrapoint.co.za/subscriptions",
      "item": [
        {
          "name": "List subscriptions",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/subscriptions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "subscriptions"
              ],
              "query": [
                {
                  "key": "externalReference",
                  "value": "",
                  "description": "The payment link's externalReference.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                }
              ]
            },
            "description": "Gateway-managed subscriptions started by recurring payment links, newest first.\n\nReference: https://docs.centrapoint.co.za/reference#listSubscriptions"
          },
          "response": [
            {
              "name": "200 Subscriptions",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions"
                  ],
                  "query": [
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "The payment link's externalReference.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg2s5b8k0007sub0001abcd\",\n      \"status\": \"active\",\n      \"frequency\": \"monthly\",\n      \"amount\": 499,\n      \"currency\": \"ZAR\",\n      \"gateway\": \"payfast\",\n      \"paymentLinkId\": \"cmg1k2x3y0001abcd1234efgh\",\n      \"externalReference\": \"SUB-ACME-PRO\",\n      \"metadata\": {\n        \"plan\": \"pro\"\n      },\n      \"createdAt\": \"2026-09-25T08:14:04.000Z\",\n      \"updatedAt\": \"2026-09-25T08:14:04.000Z\"\n    }\n  ]\n}"
            },
            {
              "name": "403 API access (or the feature) is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions"
                  ],
                  "query": [
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "The payment link's externalReference.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions"
                  ],
                  "query": [
                    {
                      "key": "externalReference",
                      "value": "",
                      "description": "The payment link's externalReference.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Get a subscription",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/subscriptions/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "subscriptions",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2s5b8k0007sub0001abcd"
                }
              ]
            },
            "description": "Reference: https://docs.centrapoint.co.za/reference#getSubscription"
          },
          "response": [
            {
              "name": "200 The subscription",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2s5b8k0007sub0001abcd\",\n  \"status\": \"active\",\n  \"frequency\": \"monthly\",\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"gateway\": \"payfast\",\n  \"paymentLinkId\": \"cmg1k2x3y0001abcd1234efgh\",\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"metadata\": {\n    \"plan\": \"pro\"\n  },\n  \"createdAt\": \"2026-09-25T08:14:04.000Z\",\n  \"updatedAt\": \"2026-09-25T08:14:04.000Z\"\n}"
            },
            {
              "name": "403 API access (or the feature) is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No subscription with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Subscription not found\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Pause a subscription",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/subscriptions/:id/pause",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "subscriptions",
                ":id",
                "pause"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2s5b8k0007sub0001abcd"
                }
              ]
            },
            "description": "Pauses future collections at the gateway and sends `subscription.paused`. Allowed from `active`. Supported on gateways that can pause subscriptions, e.g. PayFast. Repeating a call that already took effect returns 200 with the subscription unchanged (the Idempotency-Key header is not used). An invalid transition returns 409 `invalid_state` and nothing changes. No body is required.\n\nReference: https://docs.centrapoint.co.za/reference#pauseSubscription"
          },
          "response": [
            {
              "name": "200 The subscription (status `paused`)",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2s5b8k0007sub0001abcd\",\n  \"status\": \"paused\",\n  \"frequency\": \"monthly\",\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"gateway\": \"payfast\",\n  \"paymentLinkId\": \"cmg1k2x3y0001abcd1234efgh\",\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"metadata\": {\n    \"plan\": \"pro\"\n  },\n  \"createdAt\": \"2026-09-25T08:14:04.000Z\",\n  \"updatedAt\": \"2026-09-25T08:14:04.000Z\"\n}"
            },
            {
              "name": "403 Account is read-only (suspended, cancelled or trial ended), or a plan feature/quota is missing",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No subscription with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Subscription not found\"\n}"
            },
            {
              "name": "409 invalidState",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_state\",\n  \"message\": \"Subscription is cancelled\"\n}"
            },
            {
              "name": "409 unsupported",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"unsupported\",\n  \"message\": \"Netcash Pay Now does not support pausing subscriptions\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            },
            {
              "name": "502 The gateway rejected or failed the request",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/pause",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "pause"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "",
              "code": 502,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"gateway_error\",\n  \"message\": \"The payment gateway did not accept the request (pausing). Please try again.\"\n}"
            }
          ]
        },
        {
          "name": "Resume a subscription",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/subscriptions/:id/resume",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "subscriptions",
                ":id",
                "resume"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2s5b8k0007sub0001abcd"
                }
              ]
            },
            "description": "Resumes a paused subscription at the gateway and sends `subscription.resumed`. Allowed from `paused`. Supported on gateways that can pause subscriptions, e.g. PayFast. Repeating a call that already took effect returns 200 with the subscription unchanged (the Idempotency-Key header is not used). An invalid transition returns 409 `invalid_state` and nothing changes. No body is required.\n\nReference: https://docs.centrapoint.co.za/reference#resumeSubscription"
          },
          "response": [
            {
              "name": "200 The subscription (status `active`)",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2s5b8k0007sub0001abcd\",\n  \"status\": \"active\",\n  \"frequency\": \"monthly\",\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"gateway\": \"payfast\",\n  \"paymentLinkId\": \"cmg1k2x3y0001abcd1234efgh\",\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"metadata\": {\n    \"plan\": \"pro\"\n  },\n  \"createdAt\": \"2026-09-25T08:14:04.000Z\",\n  \"updatedAt\": \"2026-09-25T08:14:04.000Z\"\n}"
            },
            {
              "name": "403 Account is read-only (suspended, cancelled or trial ended), or a plan feature/quota is missing",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No subscription with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Subscription not found\"\n}"
            },
            {
              "name": "409 invalidState",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_state\",\n  \"message\": \"Subscription is cancelled\"\n}"
            },
            {
              "name": "409 unsupported",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"unsupported\",\n  \"message\": \"Netcash Pay Now does not support resuming subscriptions\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            },
            {
              "name": "502 The gateway rejected or failed the request",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/resume",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "resume"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "",
              "code": 502,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"gateway_error\",\n  \"message\": \"The payment gateway did not accept the request (resuming). Please try again.\"\n}"
            }
          ]
        },
        {
          "name": "Cancel a subscription",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/subscriptions/:id/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "subscriptions",
                ":id",
                "cancel"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2s5b8k0007sub0001abcd"
                }
              ]
            },
            "description": "Stops future collections at the gateway and sends `subscription.cancelled`. Allowed from `active` or `paused`. Repeating a call that already took effect returns 200 with the subscription unchanged (the Idempotency-Key header is not used). An invalid transition returns 409 `invalid_state` and nothing changes. No body is required.\n\nReference: https://docs.centrapoint.co.za/reference#cancelSubscription"
          },
          "response": [
            {
              "name": "200 The cancelled subscription",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2s5b8k0007sub0001abcd\",\n  \"status\": \"cancelled\",\n  \"frequency\": \"monthly\",\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"gateway\": \"payfast\",\n  \"paymentLinkId\": \"cmg1k2x3y0001abcd1234efgh\",\n  \"externalReference\": \"SUB-ACME-PRO\",\n  \"metadata\": {\n    \"plan\": \"pro\"\n  },\n  \"createdAt\": \"2026-09-25T08:14:04.000Z\",\n  \"updatedAt\": \"2026-09-25T08:14:04.000Z\"\n}"
            },
            {
              "name": "403 Account is read-only (suspended, cancelled or trial ended), or a plan feature/quota is missing",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No subscription with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Subscription not found\"\n}"
            },
            {
              "name": "409 `invalid_state`: not allowed from the current status",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_state\",\n  \"message\": \"Subscription is cancelled\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            },
            {
              "name": "502 The gateway rejected or failed the request",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2s5b8k0007sub0001abcd"
                    }
                  ]
                }
              },
              "status": "",
              "code": 502,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"gateway_error\",\n  \"message\": \"The payment gateway did not accept the cancellation. Please try again.\"\n}"
            }
          ]
        },
        {
          "name": "Change amount or next charge date",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/subscriptions/:id/update",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "subscriptions",
                ":id",
                "update"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Changes the amount (what the payer pays) and/or next charge date (`YYYY-MM-DD`). In place where the gateway supports it (PayFast: amount and date). Otherwise an amount change uses the replace flow (Netcash Pay Now): the payer is emailed a new recurring checkout at the new amount (`result.mode: replace`, `result.payUrl`); once it is paid the old gateway subscription is cancelled (Netcash DeleteSubscription) and `subscription.cancelled` is sent for the old one. While that checkout is unpaid, a replacement at the same amount emails the same link again (same `paymentLinkId` / `payUrl`) instead of a second one; a replacement at another amount deactivates it (if the payer still completes it, it replaces the subscription and the newer link is deactivated); two replacements at the same time leave one open link. If the payer completes one checkout link twice, only the first payment replaces the subscription: the card subscription the second one started is cancelled at the gateway where the gateway can (otherwise the report says so, and it keeps collecting until you cancel it on the gateway's dashboard) and that payment is reported to your staff to refund. When the subscription is replaced, its unpaid retry links are deactivated. `replace: false` refuses instead. A token that collects a customer subscription must be changed through the customer subscription.\n\n**Invoice-linked subscriptions** (started by a recurring payment link created with `invoiceId`) invoice every payment with a copy of the latest invoice's lines, so their amount is those lines' total and cannot change: another amount returns `409 invoice_linked` and nothing is changed (a new `nextDate` is still accepted). A subscription whose amount was changed before 1.14.1 and no longer matches its lines can be set back to the lines total. Only the current replacement checkout replaces an invoice-linked subscription: a payment on an earlier one leaves the subscription as it is and is reported to your staff (audit log `payment.renewal_unallocated` and a notification). To bill a different amount, cancel the subscription and create a recurring payment link for a new invoice with the new lines.\n\nReference: https://docs.centrapoint.co.za/reference#updateSubscription",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 599\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "409 invoiceLinked",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/update",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "update"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": ""
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 599\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invoice_linked\",\n  \"message\": \"This subscription is billed with invoice INV-000042: every payment is invoiced with a copy of its lines (R 299,00), so an amount change cannot use another amount. To bill a different amount, cancel the subscription and create a recurring payment link for a new invoice with the new lines.\"\n}"
            }
          ]
        },
        {
          "name": "Retry a failed charge",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/subscriptions/:id/retry",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "subscriptions",
                ":id",
                "retry"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Re-collects the latest missed charge that has not been re-collected yet: a failed gateway renewal or charged retry of this subscription (a failed retry stands for the charge it retried). A payer's declined attempt on a retry link or replacement checkout is not a missed charge, and neither is a failed renewal of the card subscription a replacement checkout started (retry that subscription instead). Tokens CentraPoint can charge itself are charged now (`mode: charged`); otherwise the payer is emailed a once-off payment link for the amount (`mode: payment_link`; an earlier unpaid retry link for the same charge is deactivated). A charge is re-collected once: by a completed charged retry, a paid retry link, or a charged retry that is still pending (until the gateway reports its result). When no missed charge is left to re-collect, a subscription that never missed a charge is collected now (`amount`, or the subscription amount); one whose missed charges were all re-collected returns `409 nothing_to_retry` unless you send `amount`, which is then collected now. Retries of one subscription are handled one at a time, so two calls at once cannot re-collect a charge twice.\n\nFor a subscription started by a payment link, a charged retry is recorded as a collection of that link, like a gateway renewal: the transaction has `renewal: true` (and `retry: true` in the charges list) and sends `subscription.charged` / `subscription.payment_failed`. Charged retries of other subscriptions have `renewal: false`.\n\n**Invoice-linked subscriptions** (recurring payment link with `invoiceId`): a retry needs a missed charge that was not re-collected yet (else `409 nothing_to_retry`, also with `amount`) and the invoice lines' total, which is the default (another `amount` returns `409 invoice_linked`). The retry payment (charged, or the retry link once paid) is invoiced exactly once, like a renewal, for the period after the latest invoice. A second payment for a charge that was already re-collected (e.g. an earlier retry link the payer was still paying) is not invoiced: it is reported to your staff (audit log `payment.renewal_unallocated` and a notification) to refund or allocate.\n\nReference: https://docs.centrapoint.co.za/reference#retrySubscriptionCharge",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "409 nothingToRetry",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/retry",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "retry"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": ""
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"nothing_to_retry\",\n  \"message\": \"Every failed charge of this subscription was already re-collected (or a retry is still pending)\"\n}"
            },
            {
              "name": "409 invoiceLinked",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/subscriptions/:id/retry",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "subscriptions",
                    ":id",
                    "retry"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": ""
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invoice_linked\",\n  \"message\": \"This subscription is billed with invoice INV-000042: every payment is invoiced with a copy of its lines (R 299,00), so a retry cannot use another amount. To bill a different amount, cancel the subscription and create a recurring payment link for a new invoice with the new lines.\"\n}"
            }
          ]
        },
        {
          "name": "List charges",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/subscriptions/:id/charges",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "subscriptions",
                ":id",
                "charges"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Every charge of the subscription, newest first: first payment, gateway renewals, retries (charged, and payments or declined attempts on retry links) and payments or declined attempts on its replacement checkouts. The renewals of the card subscription a replacement checkout started are that subscription's charges.\n\nReference: https://docs.centrapoint.co.za/reference#listSubscriptionCharges"
          },
          "response": []
        },
        {
          "name": "List migrations",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/subscriptions/migrations",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "subscriptions",
                "migrations"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Email, name or legacy reference contains.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ]
            },
            "description": "Newest first; `summary` counts migrations per status.\n\nReference: https://docs.centrapoint.co.za/reference#listSubscriptionMigrations"
          },
          "response": []
        },
        {
          "name": "Migrate legacy subscriptions",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/subscriptions/migrations",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "subscriptions",
                "migrations"
              ]
            },
            "description": "One legacy subscription (201; 200 when the legacyReference exists) or `{subscriptions: [...]}` (up to 500; a result per row). CentraPoint creates the customer (by email) and an incomplete gateway customer subscription, and emails the payer a recurring checkout link to re-authorise their card. When paid the subscription activates and, with `cancelLegacy: on_authorised`, the legacy instruction is cancelled (Netcash DeleteSubscription with the legacy reference).\n\nReference: https://docs.centrapoint.co.za/reference#createSubscriptionMigrations",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"payerName\": \"Jane Smith\",\n  \"email\": \"jane@example.co.za\",\n  \"amount\": 115,\n  \"frequency\": \"monthly\",\n  \"nextDate\": \"2026-11-01\",\n  \"legacyReference\": \"INV-2019-0042\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Get a migration",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/subscriptions/migrations/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "subscriptions",
                "migrations",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                }
              ]
            },
            "description": "Reference: https://docs.centrapoint.co.za/reference#getSubscriptionMigration"
          },
          "response": []
        },
        {
          "name": "Migration actions",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/subscriptions/migrations/:id/:action",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "subscriptions",
                "migrations",
                ":id",
                ":action"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": ""
                },
                {
                  "key": "action",
                  "value": ""
                }
              ]
            },
            "description": "`send-link`: (re)email the checkout link. `cancel-legacy`: DeleteSubscription at Netcash now. `mark-legacy-cancelled` {note?}: it was cancelled in the Netcash portal. `cancel`: abandon a migration the payer has not authorised.\n\nReference: https://docs.centrapoint.co.za/reference#subscriptionMigrationAction",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "EFT orders",
      "description": "Bank transfers with a unique deposit reference and proof of payment.\n\nDocs: https://docs.centrapoint.co.za/eft-orders",
      "item": [
        {
          "name": "List EFT orders",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/eft-orders",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "eft-orders"
              ],
              "query": [
                {
                  "key": "externalReference",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "customerId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                }
              ]
            },
            "description": "Newest first.\n\nReference: https://docs.centrapoint.co.za/reference#listEftOrders"
          },
          "response": [
            {
              "name": "200 EFT orders",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders"
                  ],
                  "query": [
                    {
                      "key": "externalReference",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "status",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg3e1f2t0009eft0001abcd\",\n      \"reference\": \"EFT-7K3Q9P2M\",\n      \"status\": \"awaiting_review\",\n      \"amount\": 1250,\n      \"currency\": \"ZAR\",\n      \"description\": \"Order #1001\",\n      \"externalReference\": \"ORDER-1001\",\n      \"metadata\": {\n        \"cartId\": \"c_8841\"\n      },\n      \"customer\": {\n        \"id\": \"cmg2c0s7t0003cust0001abcd\",\n        \"externalReference\": \"CRM-1001\"\n      },\n      \"bankDetails\": {\n        \"bankName\": \"FNB\",\n        \"accountName\": \"Example Traders (Pty) Ltd\",\n        \"accountNumber\": \"62000000000\",\n        \"branchCode\": \"250655\",\n        \"accountType\": \"current\"\n      },\n      \"paymentReference\": \"EFT-7K3Q9P2M\",\n      \"payUrl\": \"https://app.centrapoint.co.za/eft/cmg3e1f2t0009eft0001abcd.Qm9ndXMtc2lnbmF0dXJlLWV4YW1wbGU\",\n      \"proofs\": [\n        {\n          \"id\": \"cmg3p0r0f0011prf0001abcd\",\n          \"fileName\": \"proof.pdf\",\n          \"contentType\": \"application/pdf\",\n          \"size\": 184213,\n          \"source\": \"payer\",\n          \"createdAt\": \"2026-09-25T09:12:00.000Z\"\n        }\n      ],\n      \"rejectionReason\": null,\n      \"expiresAt\": \"2026-10-02T08:00:00.000Z\",\n      \"reviewedAt\": null,\n      \"paidAt\": null,\n      \"createdAt\": \"2026-09-25T08:00:00.000Z\"\n    }\n  ]\n}"
            },
            {
              "name": "400 Unknown status",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders"
                  ],
                  "query": [
                    {
                      "key": "externalReference",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "status",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"status must be one of awaiting_payment, awaiting_review, paid, rejected, expired, cancelled\"\n}"
            },
            {
              "name": "403 Plan does not include the API or payment links, or the account is read-only (writes)",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders"
                  ],
                  "query": [
                    {
                      "key": "externalReference",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "status",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders"
                  ],
                  "query": [
                    {
                      "key": "externalReference",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "status",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Create an EFT order",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/eft-orders",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "eft-orders"
              ]
            },
            "description": "Issues a unique deposit reference and returns your bank details for the payer (201). Requires an enabled Manual EFT gateway, the Payment links feature and API access. Idempotent on `externalReference` for open orders (200).\n\nReference: https://docs.centrapoint.co.za/reference#createEftOrder",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 1250,\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"description\": \"Order #1001\",\n  \"externalReference\": \"ORDER-1001\",\n  \"metadata\": {\n    \"cartId\": \"c_8841\"\n  },\n  \"notifyPayer\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 An open order with this externalReference already existed; returned unchanged",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 1250,\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"description\": \"Order #1001\",\n  \"externalReference\": \"ORDER-1001\",\n  \"metadata\": {\n    \"cartId\": \"c_8841\"\n  },\n  \"notifyPayer\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg3e1f2t0009eft0001abcd\",\n  \"reference\": \"EFT-7K3Q9P2M\",\n  \"status\": \"awaiting_payment\",\n  \"amount\": 1250,\n  \"currency\": \"ZAR\",\n  \"description\": \"Order #1001\",\n  \"externalReference\": \"ORDER-1001\",\n  \"metadata\": {\n    \"cartId\": \"c_8841\"\n  },\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"bankDetails\": {\n    \"bankName\": \"FNB\",\n    \"accountName\": \"Example Traders (Pty) Ltd\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\"\n  },\n  \"paymentReference\": \"EFT-7K3Q9P2M\",\n  \"payUrl\": \"https://app.centrapoint.co.za/eft/cmg3e1f2t0009eft0001abcd.Qm9ndXMtc2lnbmF0dXJlLWV4YW1wbGU\",\n  \"proofs\": [],\n  \"rejectionReason\": null,\n  \"expiresAt\": \"2026-10-02T08:00:00.000Z\",\n  \"reviewedAt\": null,\n  \"paidAt\": null,\n  \"createdAt\": \"2026-09-25T08:00:00.000Z\"\n}"
            },
            {
              "name": "201 Order created",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 1250,\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"description\": \"Order #1001\",\n  \"externalReference\": \"ORDER-1001\",\n  \"metadata\": {\n    \"cartId\": \"c_8841\"\n  },\n  \"notifyPayer\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg3e1f2t0009eft0001abcd\",\n  \"reference\": \"EFT-7K3Q9P2M\",\n  \"status\": \"awaiting_payment\",\n  \"amount\": 1250,\n  \"currency\": \"ZAR\",\n  \"description\": \"Order #1001\",\n  \"externalReference\": \"ORDER-1001\",\n  \"metadata\": {\n    \"cartId\": \"c_8841\"\n  },\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"bankDetails\": {\n    \"bankName\": \"FNB\",\n    \"accountName\": \"Example Traders (Pty) Ltd\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\"\n  },\n  \"paymentReference\": \"EFT-7K3Q9P2M\",\n  \"payUrl\": \"https://app.centrapoint.co.za/eft/cmg3e1f2t0009eft0001abcd.Qm9ndXMtc2lnbmF0dXJlLWV4YW1wbGU\",\n  \"proofs\": [],\n  \"rejectionReason\": null,\n  \"expiresAt\": \"2026-10-02T08:00:00.000Z\",\n  \"reviewedAt\": null,\n  \"paidAt\": null,\n  \"createdAt\": \"2026-09-25T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed, Manual EFT not set up or not available, unsupported currency, customer not found, expiresAt out o",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 1250,\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"description\": \"Order #1001\",\n  \"externalReference\": \"ORDER-1001\",\n  \"metadata\": {\n    \"cartId\": \"c_8841\"\n  },\n  \"notifyPayer\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Manual EFT is not set up. Add a 'Manual EFT (bank transfer)' gateway with your bank details under Settings > Payment providers.\"\n}"
            },
            {
              "name": "403 Plan lacks the API or payment links, monthly transaction limit reached (`plan_limit`), or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 1250,\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"description\": \"Order #1001\",\n  \"externalReference\": \"ORDER-1001\",\n  \"metadata\": {\n    \"cartId\": \"c_8841\"\n  },\n  \"notifyPayer\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 1250,\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"description\": \"Order #1001\",\n  \"externalReference\": \"ORDER-1001\",\n  \"metadata\": {\n    \"cartId\": \"c_8841\"\n  },\n  \"notifyPayer\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 1250,\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"description\": \"Order #1001\",\n  \"externalReference\": \"ORDER-1001\",\n  \"metadata\": {\n    \"cartId\": \"c_8841\"\n  },\n  \"notifyPayer\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Get an EFT order",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/eft-orders/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "eft-orders",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3e1f2t0009eft0001abcd"
                }
              ]
            },
            "description": "Reference: https://docs.centrapoint.co.za/reference#getEftOrder"
          },
          "response": [
            {
              "name": "200 The order",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg3e1f2t0009eft0001abcd\",\n  \"reference\": \"EFT-7K3Q9P2M\",\n  \"status\": \"awaiting_review\",\n  \"amount\": 1250,\n  \"currency\": \"ZAR\",\n  \"description\": \"Order #1001\",\n  \"externalReference\": \"ORDER-1001\",\n  \"metadata\": {\n    \"cartId\": \"c_8841\"\n  },\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"bankDetails\": {\n    \"bankName\": \"FNB\",\n    \"accountName\": \"Example Traders (Pty) Ltd\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\"\n  },\n  \"paymentReference\": \"EFT-7K3Q9P2M\",\n  \"payUrl\": \"https://app.centrapoint.co.za/eft/cmg3e1f2t0009eft0001abcd.Qm9ndXMtc2lnbmF0dXJlLWV4YW1wbGU\",\n  \"proofs\": [\n    {\n      \"id\": \"cmg3p0r0f0011prf0001abcd\",\n      \"fileName\": \"proof.pdf\",\n      \"contentType\": \"application/pdf\",\n      \"size\": 184213,\n      \"source\": \"payer\",\n      \"createdAt\": \"2026-09-25T09:12:00.000Z\"\n    }\n  ],\n  \"rejectionReason\": null,\n  \"expiresAt\": \"2026-10-02T08:00:00.000Z\",\n  \"reviewedAt\": null,\n  \"paidAt\": null,\n  \"createdAt\": \"2026-09-25T08:00:00.000Z\"\n}"
            },
            {
              "name": "403 Plan does not include the API or payment links, or the account is read-only (writes)",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No EFT order with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"EFT order not found\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Upload proof of payment",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/eft-orders/:id/proof",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "eft-orders",
                ":id",
                "proof"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3e1f2t0009eft0001abcd"
                }
              ]
            },
            "description": "`multipart/form-data` with one `file` field. The type is detected from the file's bytes: PDF, PNG or JPEG only; at most 10 MB; at most 10 files per order. Allowed while the order is awaiting_payment, awaiting_review or rejected (and not past its expiry, unless already in review). Moves the order to `awaiting_review`, notifies your staff and sends `eft.proof_received`. Uploading an identical file again is harmless (deduplicated by content hash). The Idempotency-Key header is not used on this endpoint.\n\nReference: https://docs.centrapoint.co.za/reference#uploadEftProof",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": "",
                  "description": "PDF, PNG or JPEG, max 10 MB."
                }
              ]
            }
          },
          "response": [
            {
              "name": "200 The order after the upload",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/proof",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "proof"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "file",
                      "type": "file",
                      "src": "",
                      "description": "PDF, PNG or JPEG, max 10 MB."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg3e1f2t0009eft0001abcd\",\n  \"reference\": \"EFT-7K3Q9P2M\",\n  \"status\": \"awaiting_review\",\n  \"amount\": 1250,\n  \"currency\": \"ZAR\",\n  \"description\": \"Order #1001\",\n  \"externalReference\": \"ORDER-1001\",\n  \"metadata\": {\n    \"cartId\": \"c_8841\"\n  },\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"bankDetails\": {\n    \"bankName\": \"FNB\",\n    \"accountName\": \"Example Traders (Pty) Ltd\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\"\n  },\n  \"paymentReference\": \"EFT-7K3Q9P2M\",\n  \"payUrl\": \"https://app.centrapoint.co.za/eft/cmg3e1f2t0009eft0001abcd.Qm9ndXMtc2lnbmF0dXJlLWV4YW1wbGU\",\n  \"proofs\": [\n    {\n      \"id\": \"cmg3p0r0f0011prf0001abcd\",\n      \"fileName\": \"proof.pdf\",\n      \"contentType\": \"application/pdf\",\n      \"size\": 184213,\n      \"source\": \"payer\",\n      \"createdAt\": \"2026-09-25T09:12:00.000Z\"\n    }\n  ],\n  \"rejectionReason\": null,\n  \"expiresAt\": \"2026-10-02T08:00:00.000Z\",\n  \"reviewedAt\": null,\n  \"paidAt\": null,\n  \"createdAt\": \"2026-09-25T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 Missing file, empty or unsupported file type, order not open or expired, or too many proofs",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/proof",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "proof"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "file",
                      "type": "file",
                      "src": "",
                      "description": "PDF, PNG or JPEG, max 10 MB."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Proof must be a PDF, PNG or JPEG file\"\n}"
            },
            {
              "name": "403 Plan does not include the API or payment links, or the account is read-only (writes)",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/proof",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "proof"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "file",
                      "type": "file",
                      "src": "",
                      "description": "PDF, PNG or JPEG, max 10 MB."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No EFT order with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/proof",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "proof"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "file",
                      "type": "file",
                      "src": "",
                      "description": "PDF, PNG or JPEG, max 10 MB."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"EFT order not found\"\n}"
            },
            {
              "name": "413 File larger than 10 MB",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/proof",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "proof"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "file",
                      "type": "file",
                      "src": "",
                      "description": "PDF, PNG or JPEG, max 10 MB."
                    }
                  ]
                }
              },
              "status": "Payload Too Large",
              "code": 413,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"File is larger than 10 MB\"\n}"
            },
            {
              "name": "415 Body is not multipart/form-data",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/proof",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "proof"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "file",
                      "type": "file",
                      "src": "",
                      "description": "PDF, PNG or JPEG, max 10 MB."
                    }
                  ]
                }
              },
              "status": "Unsupported Media Type",
              "code": 415,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Send multipart/form-data with a 'file' field\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/proof",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "proof"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "file",
                      "type": "file",
                      "src": "",
                      "description": "PDF, PNG or JPEG, max 10 MB."
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Download a proof of payment",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/eft-orders/:id/proofs/:proofId",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "eft-orders",
                ":id",
                "proofs",
                ":proofId"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3e1f2t0009eft0001abcd"
                },
                {
                  "key": "proofId",
                  "value": "cmg3p0r0f0011prf0001abcd"
                }
              ]
            },
            "description": "One proof-of-payment file of an EFT order, exactly as it was uploaded (by the payer on the EFT payment page, or through Upload proof of payment). `proofId` is an `id` from the order's `proofs` list. The Content-Type is the type detected at upload (PDF, PNG or JPEG); the file is sent as an attachment with `Cache-Control: private, no-store`. Requires payment links in your plan.\n\nReference: https://docs.centrapoint.co.za/reference#downloadEftProof"
          },
          "response": [
            {
              "name": "403 Plan does not include the API or payment links",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/proofs/:proofId",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "proofs",
                    ":proofId"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    },
                    {
                      "key": "proofId",
                      "value": "cmg3p0r0f0011prf0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No such proof on this EFT order in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/proofs/:proofId",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "proofs",
                    ":proofId"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    },
                    {
                      "key": "proofId",
                      "value": "cmg3p0r0f0011prf0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Proof not found\"\n}"
            }
          ]
        },
        {
          "name": "Cancel an EFT order",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/eft-orders/:id/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "eft-orders",
                ":id",
                "cancel"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3e1f2t0009eft0001abcd"
                }
              ]
            },
            "description": "Cancels an unpaid order (awaiting_payment, awaiting_review or rejected) and its pending transaction, and sends `eft.cancelled` and `payment.cancelled`. Cancelling a cancelled order returns it unchanged. No body is required.\n\nReference: https://docs.centrapoint.co.za/reference#cancelEftOrder"
          },
          "response": [
            {
              "name": "200 The cancelled order",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg3e1f2t0009eft0001abcd\",\n  \"reference\": \"EFT-7K3Q9P2M\",\n  \"status\": \"cancelled\",\n  \"amount\": 1250,\n  \"currency\": \"ZAR\",\n  \"description\": \"Order #1001\",\n  \"externalReference\": \"ORDER-1001\",\n  \"metadata\": {\n    \"cartId\": \"c_8841\"\n  },\n  \"customer\": {\n    \"id\": \"cmg2c0s7t0003cust0001abcd\",\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"bankDetails\": {\n    \"bankName\": \"FNB\",\n    \"accountName\": \"Example Traders (Pty) Ltd\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\"\n  },\n  \"paymentReference\": \"EFT-7K3Q9P2M\",\n  \"payUrl\": \"https://app.centrapoint.co.za/eft/cmg3e1f2t0009eft0001abcd.Qm9ndXMtc2lnbmF0dXJlLWV4YW1wbGU\",\n  \"proofs\": [],\n  \"rejectionReason\": null,\n  \"expiresAt\": \"2026-10-02T08:00:00.000Z\",\n  \"reviewedAt\": null,\n  \"paidAt\": null,\n  \"createdAt\": \"2026-09-25T08:00:00.000Z\"\n}"
            },
            {
              "name": "400 The order is paid or expired",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"EFT order is paid\"\n}"
            },
            {
              "name": "403 Plan does not include the API or payment links, or the account is read-only (writes)",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No EFT order with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"EFT order not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/eft-orders/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "eft-orders",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3e1f2t0009eft0001abcd"
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Mandates",
      "description": "Netcash debit order mandates and online agreements. Requires Debit orders.\n\nDocs: https://docs.centrapoint.co.za/mandates",
      "item": [
        {
          "name": "List mandates",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/mandates",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "mandates"
              ],
              "query": [
                {
                  "key": "customerId",
                  "value": "",
                  "description": "Filter by customer.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Filter by status.",
                  "disabled": true
                },
                {
                  "key": "accountReference",
                  "value": "",
                  "description": "Exact match (case-insensitive), e.g. `DO7F3A1C9B2E`.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                }
              ]
            },
            "description": "Newest first. Requires Debit orders in your plan.\n\nReference: https://docs.centrapoint.co.za/reference#listMandates"
          },
          "response": [
            {
              "name": "200 Mandates",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates"
                  ],
                  "query": [
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "status",
                      "value": "",
                      "description": "Filter by status.",
                      "disabled": true
                    },
                    {
                      "key": "accountReference",
                      "value": "",
                      "description": "Exact match (case-insensitive), e.g. `DO7F3A1C9B2E`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg4m3n4o0006mdt0001abcd\",\n      \"object\": \"mandate\",\n      \"accountReference\": \"DO7F3A1C9B2E\",\n      \"status\": \"pending\",\n      \"stage\": \"awaiting_signature\",\n      \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n      \"productId\": null,\n      \"subscriptionId\": null,\n      \"description\": \"Monthly service fee\",\n      \"amount\": 499,\n      \"currency\": \"ZAR\",\n      \"frequency\": \"monthly\",\n      \"debitDay\": 1,\n      \"startDate\": \"2026-10-01\",\n      \"endDate\": null,\n      \"nextDebitDate\": null,\n      \"bank\": {\n        \"name\": \"FNB\",\n        \"branchCode\": \"250655\",\n        \"accountType\": \"current\",\n        \"accountHolder\": \"T Nkosi\",\n        \"accountNumberLast4\": \"6789\"\n      },\n      \"idNumberLast4\": null,\n      \"eMandateUrl\": null,\n      \"authorisedAt\": null,\n      \"approvedAt\": null,\n      \"rejectedAt\": null,\n      \"rejectionReason\": null,\n      \"failureCount\": 0,\n      \"lastCollectedAt\": null,\n      \"agreement\": {\n        \"signed\": false,\n        \"signedAt\": null,\n        \"latest\": {\n          \"id\": \"cmg4a7g8r0007agr0001abcd\",\n          \"status\": \"open\"\n        }\n      },\n      \"createdAt\": \"2026-09-28T08:20:00.000Z\",\n      \"updatedAt\": \"2026-09-28T08:20:00.000Z\"\n    }\n  ]\n}"
            },
            {
              "name": "400 Invalid status",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates"
                  ],
                  "query": [
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "status",
                      "value": "",
                      "description": "Filter by status.",
                      "disabled": true
                    },
                    {
                      "key": "accountReference",
                      "value": "",
                      "description": "Exact match (case-insensitive), e.g. `DO7F3A1C9B2E`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"status must be one of pending, active, paused, cancelled\"\n}"
            },
            {
              "name": "403 No API access, or the plan feature is missing",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates"
                  ],
                  "query": [
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "status",
                      "value": "",
                      "description": "Filter by status.",
                      "disabled": true
                    },
                    {
                      "key": "accountReference",
                      "value": "",
                      "description": "Exact match (case-insensitive), e.g. `DO7F3A1C9B2E`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Create a mandate",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/mandates",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "mandates"
              ]
            },
            "description": "Creates a debit order mandate (201). Bank details are validated. The mandate stays `pending` until authorised (and approved, when your debit order settings require mandate approval). With `authority: \"agreement\"` (default) the customer is emailed an agreement to sign online; the signing URL is not returned here. Use `POST /api/v1/mandates/{id}/agreement` with `{\"email\": false}` to get one. Counts towards your plan's mandate limit. Requires Debit orders.\n\nReference: https://docs.centrapoint.co.za/reference#createMandate",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"description\": \"Monthly service fee\",\n  \"bank\": {\n    \"name\": \"FNB\",\n    \"branchCode\": \"250655\",\n    \"accountNumber\": \"62123456789\",\n    \"accountType\": \"current\",\n    \"accountHolder\": \"T Nkosi\"\n  },\n  \"amount\": 499,\n  \"frequency\": \"monthly\",\n  \"debitDay\": 1,\n  \"startDate\": \"2026-10-01\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 The new mandate",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"description\": \"Monthly service fee\",\n  \"bank\": {\n    \"name\": \"FNB\",\n    \"branchCode\": \"250655\",\n    \"accountNumber\": \"62123456789\",\n    \"accountType\": \"current\",\n    \"accountHolder\": \"T Nkosi\"\n  },\n  \"amount\": 499,\n  \"frequency\": \"monthly\",\n  \"debitDay\": 1,\n  \"startDate\": \"2026-10-01\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4m3n4o0006mdt0001abcd\",\n  \"object\": \"mandate\",\n  \"accountReference\": \"DO7F3A1C9B2E\",\n  \"status\": \"pending\",\n  \"stage\": \"awaiting_signature\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"productId\": null,\n  \"subscriptionId\": null,\n  \"description\": \"Monthly service fee\",\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"frequency\": \"monthly\",\n  \"debitDay\": 1,\n  \"startDate\": \"2026-10-01\",\n  \"endDate\": null,\n  \"nextDebitDate\": null,\n  \"bank\": {\n    \"name\": \"FNB\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"accountHolder\": \"T Nkosi\",\n    \"accountNumberLast4\": \"6789\"\n  },\n  \"idNumberLast4\": null,\n  \"eMandateUrl\": null,\n  \"authorisedAt\": null,\n  \"approvedAt\": null,\n  \"rejectedAt\": null,\n  \"rejectionReason\": null,\n  \"failureCount\": 0,\n  \"lastCollectedAt\": null,\n  \"agreement\": {\n    \"signed\": false,\n    \"signedAt\": null,\n    \"latest\": {\n      \"id\": \"cmg4a7g8r0007agr0001abcd\",\n      \"status\": \"open\"\n    }\n  },\n  \"createdAt\": \"2026-09-28T08:20:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:20:00.000Z\",\n  \"warnings\": [],\n  \"agreementSent\": {\n    \"id\": \"cmg4a7g8r0007agr0001abcd\",\n    \"emailed\": true,\n    \"expiresAt\": \"2026-10-12T08:20:00.000Z\"\n  }\n}"
            },
            {
              "name": "400 Validation failed: bank details, start date in the past, no Netcash provider, offline without confirmOfflineMandate,",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"description\": \"Monthly service fee\",\n  \"bank\": {\n    \"name\": \"FNB\",\n    \"branchCode\": \"250655\",\n    \"accountNumber\": \"62123456789\",\n    \"accountType\": \"current\",\n    \"accountHolder\": \"T Nkosi\"\n  },\n  \"amount\": 499,\n  \"frequency\": \"monthly\",\n  \"debitDay\": 1,\n  \"startDate\": \"2026-10-01\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Branch code must be 6 digits and account number 5-20 digits\"\n}"
            },
            {
              "name": "403 Debit orders not in your plan, mandate limit reached (`plan_limit`), or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"description\": \"Monthly service fee\",\n  \"bank\": {\n    \"name\": \"FNB\",\n    \"branchCode\": \"250655\",\n    \"accountNumber\": \"62123456789\",\n    \"accountType\": \"current\",\n    \"accountHolder\": \"T Nkosi\"\n  },\n  \"amount\": 499,\n  \"frequency\": \"monthly\",\n  \"debitDay\": 1,\n  \"startDate\": \"2026-10-01\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_limit\",\n  \"message\": \"Active debit order mandates limit reached (50/50) on the Business plan. Upgrade under Settings > Billing.\"\n}"
            },
            {
              "name": "409 idempotencyConflict",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"description\": \"Monthly service fee\",\n  \"bank\": {\n    \"name\": \"FNB\",\n    \"branchCode\": \"250655\",\n    \"accountNumber\": \"62123456789\",\n    \"accountType\": \"current\",\n    \"accountHolder\": \"T Nkosi\"\n  },\n  \"amount\": 499,\n  \"frequency\": \"monthly\",\n  \"debitDay\": 1,\n  \"startDate\": \"2026-10-01\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            },
            {
              "name": "409 externalSubscription",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"customer\": {\n    \"externalReference\": \"CRM-1001\"\n  },\n  \"description\": \"Monthly service fee\",\n  \"bank\": {\n    \"name\": \"FNB\",\n    \"branchCode\": \"250655\",\n    \"accountNumber\": \"62123456789\",\n    \"accountType\": \"current\",\n    \"accountHolder\": \"T Nkosi\"\n  },\n  \"amount\": 499,\n  \"frequency\": \"monthly\",\n  \"debitDay\": 1,\n  \"startDate\": \"2026-10-01\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"external_subscription\",\n  \"message\": \"Billed by Acme Hosting: CentraPoint only records this subscription and cannot collect it with a debit order. Create the mandate without subscriptionId.\"\n}"
            }
          ]
        },
        {
          "name": "Get a mandate",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/mandates/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "mandates",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4m3n4o0006mdt0001abcd"
                }
              ]
            },
            "description": "Reference: https://docs.centrapoint.co.za/reference#getMandate"
          },
          "response": [
            {
              "name": "200 The mandate",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4m3n4o0006mdt0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4m3n4o0006mdt0001abcd\",\n  \"object\": \"mandate\",\n  \"accountReference\": \"DO7F3A1C9B2E\",\n  \"status\": \"pending\",\n  \"stage\": \"awaiting_signature\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"productId\": null,\n  \"subscriptionId\": null,\n  \"description\": \"Monthly service fee\",\n  \"amount\": 499,\n  \"currency\": \"ZAR\",\n  \"frequency\": \"monthly\",\n  \"debitDay\": 1,\n  \"startDate\": \"2026-10-01\",\n  \"endDate\": null,\n  \"nextDebitDate\": null,\n  \"bank\": {\n    \"name\": \"FNB\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"accountHolder\": \"T Nkosi\",\n    \"accountNumberLast4\": \"6789\"\n  },\n  \"idNumberLast4\": null,\n  \"eMandateUrl\": null,\n  \"authorisedAt\": null,\n  \"approvedAt\": null,\n  \"rejectedAt\": null,\n  \"rejectionReason\": null,\n  \"failureCount\": 0,\n  \"lastCollectedAt\": null,\n  \"agreement\": {\n    \"signed\": false,\n    \"signedAt\": null,\n    \"latest\": {\n      \"id\": \"cmg4a7g8r0007agr0001abcd\",\n      \"status\": \"open\"\n    }\n  },\n  \"createdAt\": \"2026-09-28T08:20:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:20:00.000Z\"\n}"
            },
            {
              "name": "403 No API access, or the plan feature is missing",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4m3n4o0006mdt0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No mandate with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4m3n4o0006mdt0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Mandate not found\"\n}"
            }
          ]
        },
        {
          "name": "Update a mandate",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/mandates/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "mandates",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4m3n4o0006mdt0001abcd"
                }
              ]
            },
            "description": "Changes the amount and/or debit day, or pauses, resumes or cancels the mandate. Pending mandates can't be set `active` (they activate once authorised and approved). Idempotency-Key is not used.\n\nReference: https://docs.centrapoint.co.za/reference#updateMandate",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 549\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 The updated mandate",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4m3n4o0006mdt0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 549\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4m3n4o0006mdt0001abcd\",\n  \"object\": \"mandate\",\n  \"accountReference\": \"DO7F3A1C9B2E\",\n  \"status\": \"pending\",\n  \"stage\": \"awaiting_signature\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"productId\": null,\n  \"subscriptionId\": null,\n  \"description\": \"Monthly service fee\",\n  \"amount\": 549,\n  \"currency\": \"ZAR\",\n  \"frequency\": \"monthly\",\n  \"debitDay\": 1,\n  \"startDate\": \"2026-10-01\",\n  \"endDate\": null,\n  \"nextDebitDate\": null,\n  \"bank\": {\n    \"name\": \"FNB\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"accountHolder\": \"T Nkosi\",\n    \"accountNumberLast4\": \"6789\"\n  },\n  \"idNumberLast4\": null,\n  \"eMandateUrl\": null,\n  \"authorisedAt\": null,\n  \"approvedAt\": null,\n  \"rejectedAt\": null,\n  \"rejectionReason\": null,\n  \"failureCount\": 0,\n  \"lastCollectedAt\": null,\n  \"agreement\": {\n    \"signed\": false,\n    \"signedAt\": null,\n    \"latest\": {\n      \"id\": \"cmg4a7g8r0007agr0001abcd\",\n      \"status\": \"open\"\n    }\n  },\n  \"createdAt\": \"2026-09-28T08:20:00.000Z\",\n  \"updatedAt\": \"2026-09-28T08:20:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4m3n4o0006mdt0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 549\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Send amount, debitDay and/or status\"\n}"
            },
            {
              "name": "403 Debit orders not in your plan, or the account is read-only",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4m3n4o0006mdt0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 549\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No mandate with this ID in your organisation",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4m3n4o0006mdt0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 549\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Mandate not found\"\n}"
            },
            {
              "name": "409 `status: \"active\"` for a mandate that is not paused",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4m3n4o0006mdt0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 549\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Only paused mandates can be resumed; pending mandates activate once authorised (and approved)\"\n}"
            }
          ]
        },
        {
          "name": "Issue a mandate agreement",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/mandates/:id/agreement",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "mandates",
                ":id",
                "agreement"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4m3n4o0006mdt0001abcd"
                }
              ]
            },
            "description": "Issues a new debit order agreement for online signing (any open one is withdrawn) and returns its signing URL, valid for 14 days. Emails it to the customer unless `email: false`. Not idempotent: the response carries a signing token and is never stored for replay.\n\nReference: https://docs.centrapoint.co.za/reference#createMandateAgreement",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 The agreement",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates/:id/agreement",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates",
                    ":id",
                    "agreement"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4m3n4o0006mdt0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4a7g8r0007agr0001abcd\",\n  \"object\": \"mandate_agreement\",\n  \"mandateId\": \"cmg4m3n4o0006mdt0001abcd\",\n  \"status\": \"pending\",\n  \"signUrl\": \"https://app.centrapoint.co.za/sign-mandate/3q9…\",\n  \"expiresAt\": \"2026-10-12T08:20:00.000Z\",\n  \"emailed\": false\n}"
            },
            {
              "name": "400 Validation failed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates/:id/agreement",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates",
                    ":id",
                    "agreement"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4m3n4o0006mdt0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"Invalid body\"\n}"
            },
            {
              "name": "403 Debit orders not in your plan, or the account is read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates/:id/agreement",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates",
                    ":id",
                    "agreement"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4m3n4o0006mdt0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"account_restricted\",\n  \"message\": \"Your free trial has ended. Choose a plan to continue.\"\n}"
            },
            {
              "name": "404 No mandate with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/mandates/:id/agreement",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "mandates",
                    ":id",
                    "agreement"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4m3n4o0006mdt0001abcd"
                    }
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Mandate not found\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Transactions",
      "description": "Payments: list them, or look one up by its reference.\n\nDocs: https://docs.centrapoint.co.za/transactions",
      "item": [
        {
          "name": "List transactions",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/transactions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "transactions"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "complete",
                  "description": "Filter by status.",
                  "disabled": true
                },
                {
                  "key": "type",
                  "value": "",
                  "description": "Filter by type.",
                  "disabled": true
                },
                {
                  "key": "customerId",
                  "value": "",
                  "description": "Filter by customer.",
                  "disabled": true
                },
                {
                  "key": "invoiceId",
                  "value": "",
                  "description": "Filter by invoice.",
                  "disabled": true
                },
                {
                  "key": "paymentLinkId",
                  "value": "",
                  "description": "Filter by payment link.",
                  "disabled": true
                },
                {
                  "key": "subscriptionId",
                  "value": "",
                  "description": "Filter by customer subscription.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "",
                  "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the created date.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "End date (YYYY-MM-DD, SAST, inclusive) on the created date.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ]
            },
            "description": "Payments in your organisation, newest first, with keyset pagination (`limit`, `startingAfter`). Use `GET /api/v1/transactions/{reference}` for the full detail of one payment.\n\nReference: https://docs.centrapoint.co.za/reference#listTransactions"
          },
          "response": [
            {
              "name": "200 A page of transactions",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/transactions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "transactions"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "complete",
                      "description": "Filter by status.",
                      "disabled": true
                    },
                    {
                      "key": "type",
                      "value": "",
                      "description": "Filter by type.",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "invoiceId",
                      "value": "",
                      "description": "Filter by invoice.",
                      "disabled": true
                    },
                    {
                      "key": "paymentLinkId",
                      "value": "",
                      "description": "Filter by payment link.",
                      "disabled": true
                    },
                    {
                      "key": "subscriptionId",
                      "value": "",
                      "description": "Filter by customer subscription.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the created date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the created date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg2t1x2y0009txn0001abcd\",\n      \"reference\": \"CP-20260925-9F3A1C7B\",\n      \"status\": \"complete\",\n      \"type\": \"invoice\",\n      \"amount\": 1150,\n      \"fee\": 40.25,\n      \"net\": 1109.75,\n      \"taxAmount\": 150,\n      \"discountAmount\": null,\n      \"currency\": \"ZAR\",\n      \"gateway\": \"payfast\",\n      \"description\": \"Invoice INV-00042\",\n      \"providerRef\": \"1234567\",\n      \"payerName\": \"Thandi Nkosi\",\n      \"payerEmail\": \"thandi@example.co.za\",\n      \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n      \"invoice\": {\n        \"id\": \"cmg2i4n5v0004inv0001abcd\",\n        \"number\": \"INV-00042\"\n      },\n      \"paymentLinkId\": null,\n      \"subscriptionId\": null,\n      \"refundedAmount\": 0,\n      \"paidAt\": \"2026-09-25T08:14:03.000Z\",\n      \"createdAt\": \"2026-09-25T08:12:40.000Z\",\n      \"receiptUrl\": \"/api/v1/receipts/cmg2t1x2y0009txn0001abcd\"\n    }\n  ],\n  \"hasMore\": true,\n  \"nextCursor\": \"cmg2t1x2y0009txn0001abcd\"\n}"
            },
            {
              "name": "400 Invalid status/type, bad date format, or an unknown `startingAfter`",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/transactions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "transactions"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "complete",
                      "description": "Filter by status.",
                      "disabled": true
                    },
                    {
                      "key": "type",
                      "value": "",
                      "description": "Filter by type.",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "invoiceId",
                      "value": "",
                      "description": "Filter by invoice.",
                      "disabled": true
                    },
                    {
                      "key": "paymentLinkId",
                      "value": "",
                      "description": "Filter by payment link.",
                      "disabled": true
                    },
                    {
                      "key": "subscriptionId",
                      "value": "",
                      "description": "Filter by customer subscription.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the created date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the created date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"status must be one of pending, complete, failed, cancelled, refunded, partially_refunded\"\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/transactions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "transactions"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "complete",
                      "description": "Filter by status.",
                      "disabled": true
                    },
                    {
                      "key": "type",
                      "value": "",
                      "description": "Filter by type.",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "invoiceId",
                      "value": "",
                      "description": "Filter by invoice.",
                      "disabled": true
                    },
                    {
                      "key": "paymentLinkId",
                      "value": "",
                      "description": "Filter by payment link.",
                      "disabled": true
                    },
                    {
                      "key": "subscriptionId",
                      "value": "",
                      "description": "Filter by customer subscription.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the created date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the created date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Get a transaction by reference",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/transactions/:reference",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "transactions",
                ":reference"
              ],
              "variable": [
                {
                  "key": "reference",
                  "value": "CP-20260925-9F3A1C7B",
                  "description": "CentraPoint payment reference, e.g. `CP-20260925-9F3A1C7B`. Recurring renewals use `<original reference>-<gateway payment id>`; debit order collections use `<mandate account reference>-<YYYYMMDD>`, e.g. `DO7F3A1C9B2E-20261001`."
                }
              ]
            },
            "description": "Returns the current state of a payment in your organisation, looked up by its CentraPoint payment reference. Transactions in other organisations are reported as not found.\n\nReference: https://docs.centrapoint.co.za/reference#getTransaction"
          },
          "response": [
            {
              "name": "200 The transaction",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/transactions/:reference",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "transactions",
                    ":reference"
                  ],
                  "variable": [
                    {
                      "key": "reference",
                      "value": "CP-20260925-9F3A1C7B",
                      "description": "CentraPoint payment reference, e.g. `CP-20260925-9F3A1C7B`. Recurring renewals use `<original reference>-<gateway payment id>`; debit order collections use `<mandate account reference>-<YYYYMMDD>`, e.g. `DO7F3A1C9B2E-20261001`."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"reference\": \"CP-20260925-9F3A1C7B\",\n  \"status\": \"partially_refunded\",\n  \"amount\": 499,\n  \"fee\": 14.47,\n  \"net\": 484.53,\n  \"currency\": \"ZAR\",\n  \"type\": \"once\",\n  \"gateway\": \"payfast\",\n  \"description\": \"Website hosting - October\",\n  \"providerRef\": \"2458761\",\n  \"payerEmail\": \"client@example.com\",\n  \"paymentLinkId\": \"cmg1k2x3y0001abcd1234efgh\",\n  \"externalReference\": \"ORDER-1001\",\n  \"eftOrderId\": null,\n  \"metadata\": {\n    \"crmId\": \"0061x00000AbCdE\"\n  },\n  \"renewal\": false,\n  \"parentReference\": null,\n  \"subscriptionId\": null,\n  \"refundedAmount\": 100,\n  \"refunds\": [\n    {\n      \"refundNumber\": \"REF-7C21A9F0\",\n      \"amount\": 100,\n      \"currency\": \"ZAR\",\n      \"status\": \"processed\",\n      \"processedAt\": \"2026-09-26T09:30:00.000Z\",\n      \"createdAt\": \"2026-09-26T09:29:41.000Z\"\n    }\n  ],\n  \"invoice\": null,\n  \"paidAt\": \"2026-09-25T08:14:03.512Z\",\n  \"createdAt\": \"2026-09-25T08:12:47.020Z\"\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/transactions/:reference",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "transactions",
                    ":reference"
                  ],
                  "variable": [
                    {
                      "key": "reference",
                      "value": "CP-20260925-9F3A1C7B",
                      "description": "CentraPoint payment reference, e.g. `CP-20260925-9F3A1C7B`. Recurring renewals use `<original reference>-<gateway payment id>`; debit order collections use `<mandate account reference>-<YYYYMMDD>`, e.g. `DO7F3A1C9B2E-20261001`."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            },
            {
              "name": "404 No transaction with this reference exists in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/transactions/:reference",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "transactions",
                    ":reference"
                  ],
                  "variable": [
                    {
                      "key": "reference",
                      "value": "CP-20260925-9F3A1C7B",
                      "description": "CentraPoint payment reference, e.g. `CP-20260925-9F3A1C7B`. Recurring renewals use `<original reference>-<gateway payment id>`; debit order collections use `<mandate account reference>-<YYYYMMDD>`, e.g. `DO7F3A1C9B2E-20261001`."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Transaction not found\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/transactions/:reference",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "transactions",
                    ":reference"
                  ],
                  "variable": [
                    {
                      "key": "reference",
                      "value": "CP-20260925-9F3A1C7B",
                      "description": "CentraPoint payment reference, e.g. `CP-20260925-9F3A1C7B`. Recurring renewals use `<original reference>-<gateway payment id>`; debit order collections use `<mandate account reference>-<YYYYMMDD>`, e.g. `DO7F3A1C9B2E-20261001`."
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Receipts & refunds",
      "description": "Receipts for completed payments and refund notes, as JSON or PDF.\n\nDocs: https://docs.centrapoint.co.za/receipts",
      "item": [
        {
          "name": "List receipts",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/receipts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "receipts"
              ],
              "query": [
                {
                  "key": "customerId",
                  "value": "",
                  "description": "Filter by customer.",
                  "disabled": true
                },
                {
                  "key": "invoiceId",
                  "value": "",
                  "description": "Filter by invoice.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "",
                  "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the payment date.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "End date (YYYY-MM-DD, SAST, inclusive) on the payment date.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ]
            },
            "description": "Completed payments (including those later refunded) as receipts, newest payment first. Keyset pagination with `limit` and `startingAfter`.\n\nReference: https://docs.centrapoint.co.za/reference#listReceipts"
          },
          "response": [
            {
              "name": "200 A page of receipts",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/receipts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "receipts"
                  ],
                  "query": [
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "invoiceId",
                      "value": "",
                      "description": "Filter by invoice.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the payment date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the payment date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg2t1x2y0009txn0001abcd\",\n      \"object\": \"receipt\",\n      \"receiptNumber\": \"CP-20260925-9F3A1C7B\",\n      \"reference\": \"CP-20260925-9F3A1C7B\",\n      \"status\": \"complete\",\n      \"amount\": 1150,\n      \"currency\": \"ZAR\",\n      \"taxAmount\": 150,\n      \"discountAmount\": null,\n      \"refundedAmount\": 0,\n      \"description\": \"Invoice INV-00042\",\n      \"payerName\": \"Thandi Nkosi\",\n      \"payerEmail\": \"thandi@example.co.za\",\n      \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n      \"paymentMethod\": \"PayFast\",\n      \"gateway\": \"payfast\",\n      \"invoice\": {\n        \"id\": \"cmg2i4n5v0004inv0001abcd\",\n        \"number\": \"INV-00042\",\n        \"externalReference\": \"ORD-5531\"\n      },\n      \"paidAt\": \"2026-09-25T08:14:03.000Z\",\n      \"createdAt\": \"2026-09-25T08:12:40.000Z\",\n      \"pdfUrl\": \"/api/v1/receipts/cmg2t1x2y0009txn0001abcd?format=pdf\"\n    }\n  ],\n  \"hasMore\": false,\n  \"nextCursor\": null\n}"
            },
            {
              "name": "400 Bad date format or unknown `startingAfter`",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/receipts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "receipts"
                  ],
                  "query": [
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "invoiceId",
                      "value": "",
                      "description": "Filter by invoice.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the payment date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the payment date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"from/to must be YYYY-MM-DD\"\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/receipts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "receipts"
                  ],
                  "query": [
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "invoiceId",
                      "value": "",
                      "description": "Filter by invoice.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the payment date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the payment date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Get a receipt",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/receipts/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "receipts",
                ":id"
              ],
              "query": [
                {
                  "key": "format",
                  "value": "",
                  "description": "`pdf` returns the PDF.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg2t1x2y0009txn0001abcd",
                  "description": "Transaction ID or payment reference (`CP-…`)."
                }
              ]
            },
            "description": "A receipt by transaction ID or payment reference. Add `?format=pdf` to download the branded receipt PDF (`application/pdf`) instead of JSON. Only completed, partially refunded or refunded payments have receipts.\n\nReference: https://docs.centrapoint.co.za/reference#getReceipt"
          },
          "response": [
            {
              "name": "200 The receipt (JSON), or the PDF with `?format=pdf`",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/receipts/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "receipts",
                    ":id"
                  ],
                  "query": [
                    {
                      "key": "format",
                      "value": "",
                      "description": "`pdf` returns the PDF.",
                      "disabled": true
                    }
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2t1x2y0009txn0001abcd",
                      "description": "Transaction ID or payment reference (`CP-…`)."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg2t1x2y0009txn0001abcd\",\n  \"object\": \"receipt\",\n  \"receiptNumber\": \"CP-20260925-9F3A1C7B\",\n  \"reference\": \"CP-20260925-9F3A1C7B\",\n  \"status\": \"complete\",\n  \"amount\": 1150,\n  \"currency\": \"ZAR\",\n  \"taxAmount\": 150,\n  \"discountAmount\": null,\n  \"refundedAmount\": 0,\n  \"description\": \"Invoice INV-00042\",\n  \"payerName\": \"Thandi Nkosi\",\n  \"payerEmail\": \"thandi@example.co.za\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"paymentMethod\": \"PayFast\",\n  \"gateway\": \"payfast\",\n  \"invoice\": {\n    \"id\": \"cmg2i4n5v0004inv0001abcd\",\n    \"number\": \"INV-00042\",\n    \"externalReference\": \"ORD-5531\"\n  },\n  \"paidAt\": \"2026-09-25T08:14:03.000Z\",\n  \"createdAt\": \"2026-09-25T08:12:40.000Z\",\n  \"pdfUrl\": \"/api/v1/receipts/cmg2t1x2y0009txn0001abcd?format=pdf\"\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/receipts/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "receipts",
                    ":id"
                  ],
                  "query": [
                    {
                      "key": "format",
                      "value": "",
                      "description": "`pdf` returns the PDF.",
                      "disabled": true
                    }
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2t1x2y0009txn0001abcd",
                      "description": "Transaction ID or payment reference (`CP-…`)."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            },
            {
              "name": "404 No receipt with this ID or reference (or the payment is not complete)",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/receipts/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "receipts",
                    ":id"
                  ],
                  "query": [
                    {
                      "key": "format",
                      "value": "",
                      "description": "`pdf` returns the PDF.",
                      "disabled": true
                    }
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg2t1x2y0009txn0001abcd",
                      "description": "Transaction ID or payment reference (`CP-…`)."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Receipt not found\"\n}"
            }
          ]
        },
        {
          "name": "List refunds",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/refunds",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "refunds"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "Filter by status.",
                  "disabled": true
                },
                {
                  "key": "customerId",
                  "value": "",
                  "description": "Filter by customer.",
                  "disabled": true
                },
                {
                  "key": "transactionReference",
                  "value": "",
                  "description": "Refunds of the payment with this reference.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "",
                  "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the date the refund was recorded.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "End date (YYYY-MM-DD, SAST, inclusive) on the date the refund was recorded.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ]
            },
            "description": "Refunds, newest first, with keyset pagination.\n\nReference: https://docs.centrapoint.co.za/reference#listRefunds"
          },
          "response": [
            {
              "name": "200 A page of refunds",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/refunds",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "refunds"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Filter by status.",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "transactionReference",
                      "value": "",
                      "description": "Refunds of the payment with this reference.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the date the refund was recorded.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the date the refund was recorded.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg4f5e6d0008rfd0001abcd\",\n      \"object\": \"refund\",\n      \"refundNumber\": \"REF-7C21A9F0\",\n      \"amount\": 200,\n      \"currency\": \"ZAR\",\n      \"status\": \"processed\",\n      \"reason\": \"Duplicate charge\",\n      \"providerRef\": \"1234567\",\n      \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n      \"transaction\": {\n        \"id\": \"cmg2t1x2y0009txn0001abcd\",\n        \"reference\": \"CP-20260925-9F3A1C7B\",\n        \"invoiceId\": \"cmg2i4n5v0004inv0001abcd\"\n      },\n      \"processedAt\": \"2026-09-26T09:00:00.000Z\",\n      \"createdAt\": \"2026-09-26T08:58:00.000Z\",\n      \"pdfUrl\": \"/api/v1/refunds/cmg4f5e6d0008rfd0001abcd?format=pdf\"\n    }\n  ],\n  \"hasMore\": false,\n  \"nextCursor\": null\n}"
            },
            {
              "name": "400 Invalid status, bad date format or unknown `startingAfter`",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/refunds",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "refunds"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Filter by status.",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "transactionReference",
                      "value": "",
                      "description": "Refunds of the payment with this reference.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the date the refund was recorded.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the date the refund was recorded.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"status must be one of pending, processed, failed\"\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/refunds",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "refunds"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "Filter by status.",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "description": "Filter by customer.",
                      "disabled": true
                    },
                    {
                      "key": "transactionReference",
                      "value": "",
                      "description": "Refunds of the payment with this reference.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the date the refund was recorded.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the date the refund was recorded.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Get a refund",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/refunds/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "refunds",
                ":id"
              ],
              "query": [
                {
                  "key": "format",
                  "value": "",
                  "description": "`pdf` returns the PDF.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg4f5e6d0008rfd0001abcd",
                  "description": "Refund ID or refund number (`REF-…`)."
                }
              ]
            },
            "description": "A refund by ID or refund number. `?format=pdf` returns the refund note PDF.\n\nReference: https://docs.centrapoint.co.za/reference#getRefund"
          },
          "response": [
            {
              "name": "200 The refund (JSON), or the refund note PDF with `?format=pdf`",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/refunds/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "refunds",
                    ":id"
                  ],
                  "query": [
                    {
                      "key": "format",
                      "value": "",
                      "description": "`pdf` returns the PDF.",
                      "disabled": true
                    }
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4f5e6d0008rfd0001abcd",
                      "description": "Refund ID or refund number (`REF-…`)."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg4f5e6d0008rfd0001abcd\",\n  \"object\": \"refund\",\n  \"refundNumber\": \"REF-7C21A9F0\",\n  \"amount\": 200,\n  \"currency\": \"ZAR\",\n  \"status\": \"processed\",\n  \"reason\": \"Duplicate charge\",\n  \"providerRef\": \"1234567\",\n  \"customerId\": \"cmg2c0s7t0003cust0001abcd\",\n  \"transaction\": {\n    \"id\": \"cmg2t1x2y0009txn0001abcd\",\n    \"reference\": \"CP-20260925-9F3A1C7B\",\n    \"invoiceId\": \"cmg2i4n5v0004inv0001abcd\"\n  },\n  \"processedAt\": \"2026-09-26T09:00:00.000Z\",\n  \"createdAt\": \"2026-09-26T08:58:00.000Z\",\n  \"pdfUrl\": \"/api/v1/refunds/cmg4f5e6d0008rfd0001abcd?format=pdf\"\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/refunds/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "refunds",
                    ":id"
                  ],
                  "query": [
                    {
                      "key": "format",
                      "value": "",
                      "description": "`pdf` returns the PDF.",
                      "disabled": true
                    }
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4f5e6d0008rfd0001abcd",
                      "description": "Refund ID or refund number (`REF-…`)."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            },
            {
              "name": "404 No refund with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/refunds/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "refunds",
                    ":id"
                  ],
                  "query": [
                    {
                      "key": "format",
                      "value": "",
                      "description": "`pdf` returns the PDF.",
                      "disabled": true
                    }
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg4f5e6d0008rfd0001abcd",
                      "description": "Refund ID or refund number (`REF-…`)."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Refund not found\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Payouts",
      "description": "Creditor, salary and refund payments out of your Netcash account.\n\nDocs: https://docs.centrapoint.co.za/payouts",
      "item": [
        {
          "name": "List payouts",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/payouts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "payouts"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "kind",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "customerId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ]
            },
            "description": "Newest first, with keyset pagination.\n\nReference: https://docs.centrapoint.co.za/reference#listPayouts"
          },
          "response": [
            {
              "name": "200 A page of payouts",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "kind",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"object\": \"payout\",\n      \"id\": \"cmg3p4q5r0003pay0001abcd\",\n      \"reference\": \"PAY-000031\",\n      \"kind\": \"creditor\",\n      \"status\": \"scheduled\",\n      \"beneficiaryName\": \"Acme Supplies\",\n      \"beneficiaryEmail\": \"accounts@acme.example.co.za\",\n      \"bankName\": \"FNB\",\n      \"accountLast4\": \"4821\",\n      \"amount\": 12500,\n      \"currency\": \"ZAR\",\n      \"description\": \"Invoice AS-2291\",\n      \"statementRef\": \"CentraPoint AS-2291\",\n      \"actionDate\": \"2026-10-01T00:00:00.000Z\",\n      \"submittedAt\": null,\n      \"paidAt\": null,\n      \"failureReason\": null,\n      \"customer\": null,\n      \"creditNote\": null,\n      \"createdAt\": \"2026-09-27T10:00:00.000Z\",\n      \"updatedAt\": \"2026-09-27T10:00:00.000Z\"\n    }\n  ],\n  \"hasMore\": false,\n  \"nextCursor\": null\n}"
            },
            {
              "name": "400 Invalid status or kind, or unknown `startingAfter`",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "kind",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"kind must be one of refund, creditor, salary\"\n}"
            },
            {
              "name": "403 Plan does not include the API, or account read-only",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "kind",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "customerId",
                      "value": "",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            }
          ]
        },
        {
          "name": "Schedule a payout",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/payouts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "payouts"
              ]
            },
            "description": "Schedules a creditor, salary or refund payment out of your Netcash account (Netcash Creditor & Salary Payments gateway; ZAR). Bank details are validated, stored encrypted and never returned. Emits `payout.scheduled`. Always send an Idempotency-Key. No plan feature beyond API access is needed.\n\nReference: https://docs.centrapoint.co.za/reference#createPayout",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"kind\": \"creditor\",\n  \"beneficiaryName\": \"Acme Supplies\",\n  \"beneficiaryEmail\": \"accounts@acme.example.co.za\",\n  \"bank\": {\n    \"accountHolder\": \"Acme Supplies (Pty) Ltd\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"bankName\": \"FNB\"\n  },\n  \"amount\": 12500,\n  \"actionDate\": \"2026-10-01\",\n  \"description\": \"Invoice AS-2291\",\n  \"statementRef\": \"CentraPoint AS-2291\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 Payout scheduled",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"kind\": \"creditor\",\n  \"beneficiaryName\": \"Acme Supplies\",\n  \"beneficiaryEmail\": \"accounts@acme.example.co.za\",\n  \"bank\": {\n    \"accountHolder\": \"Acme Supplies (Pty) Ltd\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"bankName\": \"FNB\"\n  },\n  \"amount\": 12500,\n  \"actionDate\": \"2026-10-01\",\n  \"description\": \"Invoice AS-2291\",\n  \"statementRef\": \"CentraPoint AS-2291\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"payout\",\n  \"id\": \"cmg3p4q5r0003pay0001abcd\",\n  \"reference\": \"PAY-000031\",\n  \"kind\": \"creditor\",\n  \"status\": \"scheduled\",\n  \"beneficiaryName\": \"Acme Supplies\",\n  \"beneficiaryEmail\": \"accounts@acme.example.co.za\",\n  \"bankName\": \"FNB\",\n  \"accountLast4\": \"4821\",\n  \"amount\": 12500,\n  \"currency\": \"ZAR\",\n  \"description\": \"Invoice AS-2291\",\n  \"statementRef\": \"CentraPoint AS-2291\",\n  \"actionDate\": \"2026-10-01T00:00:00.000Z\",\n  \"submittedAt\": null,\n  \"paidAt\": null,\n  \"failureReason\": null,\n  \"customer\": null,\n  \"creditNote\": null,\n  \"createdAt\": \"2026-09-27T10:00:00.000Z\",\n  \"updatedAt\": \"2026-09-27T10:00:00.000Z\"\n}"
            },
            {
              "name": "400 Validation failed; invalid bank details; no enabled payout gateway; gateway disabled; salary without a salary servic",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"kind\": \"creditor\",\n  \"beneficiaryName\": \"Acme Supplies\",\n  \"beneficiaryEmail\": \"accounts@acme.example.co.za\",\n  \"bank\": {\n    \"accountHolder\": \"Acme Supplies (Pty) Ltd\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"bankName\": \"FNB\"\n  },\n  \"amount\": 12500,\n  \"actionDate\": \"2026-10-01\",\n  \"description\": \"Invoice AS-2291\",\n  \"statementRef\": \"CentraPoint AS-2291\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"No Netcash Creditor & Salary Payments gateway is enabled\"\n}"
            },
            {
              "name": "403 Plan does not include the API, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"kind\": \"creditor\",\n  \"beneficiaryName\": \"Acme Supplies\",\n  \"beneficiaryEmail\": \"accounts@acme.example.co.za\",\n  \"bank\": {\n    \"accountHolder\": \"Acme Supplies (Pty) Ltd\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"bankName\": \"FNB\"\n  },\n  \"amount\": 12500,\n  \"actionDate\": \"2026-10-01\",\n  \"description\": \"Invoice AS-2291\",\n  \"statementRef\": \"CentraPoint AS-2291\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  },
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"kind\": \"creditor\",\n  \"beneficiaryName\": \"Acme Supplies\",\n  \"beneficiaryEmail\": \"accounts@acme.example.co.za\",\n  \"bank\": {\n    \"accountHolder\": \"Acme Supplies (Pty) Ltd\",\n    \"accountNumber\": \"62000000000\",\n    \"branchCode\": \"250655\",\n    \"accountType\": \"current\",\n    \"bankName\": \"FNB\"\n  },\n  \"amount\": 12500,\n  \"actionDate\": \"2026-10-01\",\n  \"description\": \"Invoice AS-2291\",\n  \"statementRef\": \"CentraPoint AS-2291\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        },
        {
          "name": "Get a payout",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/payouts/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "payouts",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3p4q5r0003pay0001abcd",
                  "description": "Payout ID or reference."
                }
              ]
            },
            "description": "Reference: https://docs.centrapoint.co.za/reference#getPayout"
          },
          "response": [
            {
              "name": "200 The payout",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3p4q5r0003pay0001abcd",
                      "description": "Payout ID or reference."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"payout\",\n  \"id\": \"cmg3p4q5r0003pay0001abcd\",\n  \"reference\": \"PAY-000031\",\n  \"kind\": \"creditor\",\n  \"status\": \"scheduled\",\n  \"beneficiaryName\": \"Acme Supplies\",\n  \"beneficiaryEmail\": \"accounts@acme.example.co.za\",\n  \"bankName\": \"FNB\",\n  \"accountLast4\": \"4821\",\n  \"amount\": 12500,\n  \"currency\": \"ZAR\",\n  \"description\": \"Invoice AS-2291\",\n  \"statementRef\": \"CentraPoint AS-2291\",\n  \"actionDate\": \"2026-10-01T00:00:00.000Z\",\n  \"submittedAt\": null,\n  \"paidAt\": null,\n  \"failureReason\": null,\n  \"customer\": null,\n  \"creditNote\": null,\n  \"createdAt\": \"2026-09-27T10:00:00.000Z\",\n  \"updatedAt\": \"2026-09-27T10:00:00.000Z\"\n}"
            },
            {
              "name": "403 Plan does not include the API, or account read-only",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3p4q5r0003pay0001abcd",
                      "description": "Payout ID or reference."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            },
            {
              "name": "404 No payout with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3p4q5r0003pay0001abcd",
                      "description": "Payout ID or reference."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Payout not found\"\n}"
            }
          ]
        },
        {
          "name": "Cancel a payout",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                "disabled": true
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/payouts/:id/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "payouts",
                ":id",
                "cancel"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3p4q5r0003pay0001abcd",
                  "description": "Payout ID or reference."
                }
              ]
            },
            "description": "Cancels a scheduled payout before it is submitted to Netcash; a credit note's reserved amount is released. Emits `payout.cancelled`.\n\nReference: https://docs.centrapoint.co.za/reference#cancelPayout"
          },
          "response": [
            {
              "name": "200 The cancelled payout",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3p4q5r0003pay0001abcd",
                      "description": "Payout ID or reference."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"object\": \"payout\",\n  \"id\": \"cmg3p4q5r0003pay0001abcd\",\n  \"reference\": \"PAY-000031\",\n  \"kind\": \"creditor\",\n  \"status\": \"cancelled\",\n  \"beneficiaryName\": \"Acme Supplies\",\n  \"beneficiaryEmail\": \"accounts@acme.example.co.za\",\n  \"bankName\": \"FNB\",\n  \"accountLast4\": \"4821\",\n  \"amount\": 12500,\n  \"currency\": \"ZAR\",\n  \"description\": \"Invoice AS-2291\",\n  \"statementRef\": \"CentraPoint AS-2291\",\n  \"actionDate\": \"2026-10-01T00:00:00.000Z\",\n  \"submittedAt\": null,\n  \"paidAt\": null,\n  \"failureReason\": null,\n  \"customer\": null,\n  \"creditNote\": null,\n  \"createdAt\": \"2026-09-27T10:00:00.000Z\",\n  \"updatedAt\": \"2026-09-27T10:00:00.000Z\"\n}"
            },
            {
              "name": "400 The payout is no longer scheduled",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3p4q5r0003pay0001abcd",
                      "description": "Payout ID or reference."
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"A submitted payout cannot be cancelled\"\n}"
            },
            {
              "name": "403 Plan does not include the API, or account read-only",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3p4q5r0003pay0001abcd",
                      "description": "Payout ID or reference."
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            },
            {
              "name": "404 No payout with this ID in your organisation",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3p4q5r0003pay0001abcd",
                      "description": "Payout ID or reference."
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Payout not found\"\n}"
            },
            {
              "name": "409 The Idempotency-Key was already used with a different request body",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Idempotency-Key",
                    "value": "{{$guid}}",
                    "description": "Optional, up to 200 characters. Keys are scoped to your organisation, the HTTP method and the exact request path (e.g. `POST /api/v1/invoices/{id}/send` for one specific invoice). Retrying with the same key and the same body within 24 hours returns the stored response (with `Idempotent-Replayed: true`) instead of repeating the operation. Same key with a different body returns 409 `idempotency_conflict`. 5xx responses are not stored.",
                    "disabled": true
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/payouts/:id/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "payouts",
                    ":id",
                    "cancel"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3p4q5r0003pay0001abcd",
                      "description": "Payout ID or reference."
                    }
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"idempotency_conflict\",\n  \"message\": \"This Idempotency-Key was already used with a different request body\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Reconciliation",
      "description": "Results of statement reconciliation runs per Netcash account: runs, statement lines and accounts.\n\nDocs: https://docs.centrapoint.co.za/reconciliation",
      "item": [
        {
          "name": "List reconciliation runs",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/reconciliation/runs",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "reconciliation",
                "runs"
              ],
              "query": [
                {
                  "key": "from",
                  "value": "",
                  "description": "YYYY-MM-DD (South African time): runs started on or after this day.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "YYYY-MM-DD (South African time): runs started on or before this day.",
                  "disabled": true
                },
                {
                  "key": "account",
                  "value": "acct_3f9a1c7b20d4e5f6",
                  "description": "Only runs of this Netcash account (`acct_…`, see List Netcash accounts).",
                  "disabled": true
                },
                {
                  "key": "source",
                  "value": "",
                  "description": "`netcash_statement` or `csv_upload`.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                }
              ]
            },
            "description": "Statement imports (Netcash statements per Netcash account and CSV uploads) with their results, newest first by start time. Requires the Reconciliation feature (Business plan and above).\n\nReference: https://docs.centrapoint.co.za/reference#listReconciliationRuns"
          },
          "response": [
            {
              "name": "200 Runs",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/runs",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "runs"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "",
                      "description": "YYYY-MM-DD (South African time): runs started on or after this day.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "YYYY-MM-DD (South African time): runs started on or before this day.",
                      "disabled": true
                    },
                    {
                      "key": "account",
                      "value": "acct_3f9a1c7b20d4e5f6",
                      "description": "Only runs of this Netcash account (`acct_…`, see List Netcash accounts).",
                      "disabled": true
                    },
                    {
                      "key": "source",
                      "value": "",
                      "description": "`netcash_statement` or `csv_upload`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg3r7c0n0013run0001abcd\",\n      \"source\": \"netcash_statement\",\n      \"account\": {\n        \"id\": \"acct_3f9a1c7b20d4e5f6\",\n        \"providers\": [\n          {\n            \"id\": \"cmg3prov0000paynow000001\",\n            \"name\": \"Card payments\",\n            \"type\": \"netcash_paynow\"\n          },\n          {\n            \"id\": \"cmg3prov0000recur0000002\",\n            \"name\": \"Subscriptions\",\n            \"type\": \"netcash_paynow\"\n          },\n          {\n            \"id\": \"cmg3prov0000credit000003\",\n            \"name\": \"Payouts\",\n            \"type\": \"netcash_creditor\"\n          }\n        ]\n      },\n      \"statementDate\": \"2026-09-24T22:00:00.000Z\",\n      \"periodStart\": \"2026-09-23T22:00:00.000Z\",\n      \"periodEnd\": \"2026-09-24T22:00:00.000Z\",\n      \"status\": \"exceptions\",\n      \"lineCount\": 42,\n      \"matched\": 38,\n      \"unmatched\": 1,\n      \"notReceived\": 1,\n      \"exceptions\": 2,\n      \"totals\": {\n        \"receipts\": 48250.5,\n        \"fees\": 612.4,\n        \"refunds\": 499,\n        \"payouts\": 33000,\n        \"settlements\": 33000,\n        \"disbursements\": 12000,\n        \"unpaids\": 350\n      },\n      \"openingBalance\": 1203.55,\n      \"closingBalance\": 2992.65,\n      \"balance\": {\n        \"opening\": 1203.55,\n        \"collections\": 48250.5,\n        \"unpaids\": -350,\n        \"refunds\": -499,\n        \"fees\": -612.4,\n        \"disbursements\": -12000,\n        \"settlements\": -33000,\n        \"other\": 0,\n        \"closing\": 2992.65,\n        \"computedClosing\": 2992.65,\n        \"difference\": 0\n      },\n      \"trigger\": \"cron\",\n      \"error\": null,\n      \"createdAt\": \"2026-09-25T02:00:03.000Z\",\n      \"completedAt\": \"2026-09-25T02:04:11.000Z\"\n    }\n  ]\n}"
            },
            {
              "name": "400 Bad date or unknown source",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/runs",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "runs"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "",
                      "description": "YYYY-MM-DD (South African time): runs started on or after this day.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "YYYY-MM-DD (South African time): runs started on or before this day.",
                      "disabled": true
                    },
                    {
                      "key": "account",
                      "value": "acct_3f9a1c7b20d4e5f6",
                      "description": "Only runs of this Netcash account (`acct_…`, see List Netcash accounts).",
                      "disabled": true
                    },
                    {
                      "key": "source",
                      "value": "",
                      "description": "`netcash_statement` or `csv_upload`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"from and to must be YYYY-MM-DD\"\n}"
            },
            {
              "name": "403 Plan does not include the API or reconciliation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/runs",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "runs"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "",
                      "description": "YYYY-MM-DD (South African time): runs started on or after this day.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "YYYY-MM-DD (South African time): runs started on or before this day.",
                      "disabled": true
                    },
                    {
                      "key": "account",
                      "value": "acct_3f9a1c7b20d4e5f6",
                      "description": "Only runs of this Netcash account (`acct_…`, see List Netcash accounts).",
                      "disabled": true
                    },
                    {
                      "key": "source",
                      "value": "",
                      "description": "`netcash_statement` or `csv_upload`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No Netcash account with this `account` id in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/runs",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "runs"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "",
                      "description": "YYYY-MM-DD (South African time): runs started on or after this day.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "YYYY-MM-DD (South African time): runs started on or before this day.",
                      "disabled": true
                    },
                    {
                      "key": "account",
                      "value": "acct_3f9a1c7b20d4e5f6",
                      "description": "Only runs of this Netcash account (`acct_…`, see List Netcash accounts).",
                      "disabled": true
                    },
                    {
                      "key": "source",
                      "value": "",
                      "description": "`netcash_statement` or `csv_upload`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Account not found\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/runs",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "runs"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "",
                      "description": "YYYY-MM-DD (South African time): runs started on or after this day.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "YYYY-MM-DD (South African time): runs started on or before this day.",
                      "disabled": true
                    },
                    {
                      "key": "account",
                      "value": "acct_3f9a1c7b20d4e5f6",
                      "description": "Only runs of this Netcash account (`acct_…`, see List Netcash accounts).",
                      "disabled": true
                    },
                    {
                      "key": "source",
                      "value": "",
                      "description": "`netcash_statement` or `csv_upload`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "Get a reconciliation run",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/reconciliation/runs/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "reconciliation",
                "runs",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "cmg3r7c0n0013run0001abcd"
                }
              ]
            },
            "description": "The run summary plus its items: every statement line except ignored ones (account fees, settlements and balances are only in `totals` and `balance`; fees linked to a payment are included), and for completed Netcash statement runs, `not_received` and `not_debited` items.\n\nReference: https://docs.centrapoint.co.za/reference#getReconciliationRun"
          },
          "response": [
            {
              "name": "200 The run with items",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/runs/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "runs",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3r7c0n0013run0001abcd"
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": \"cmg3r7c0n0013run0001abcd\",\n  \"source\": \"netcash_statement\",\n  \"account\": {\n    \"id\": \"acct_3f9a1c7b20d4e5f6\",\n    \"providers\": [\n      {\n        \"id\": \"cmg3prov0000paynow000001\",\n        \"name\": \"Card payments\",\n        \"type\": \"netcash_paynow\"\n      },\n      {\n        \"id\": \"cmg3prov0000recur0000002\",\n        \"name\": \"Subscriptions\",\n        \"type\": \"netcash_paynow\"\n      },\n      {\n        \"id\": \"cmg3prov0000credit000003\",\n        \"name\": \"Payouts\",\n        \"type\": \"netcash_creditor\"\n      }\n    ]\n  },\n  \"statementDate\": \"2026-09-24T22:00:00.000Z\",\n  \"periodStart\": \"2026-09-23T22:00:00.000Z\",\n  \"periodEnd\": \"2026-09-24T22:00:00.000Z\",\n  \"status\": \"exceptions\",\n  \"lineCount\": 42,\n  \"matched\": 38,\n  \"unmatched\": 1,\n  \"notReceived\": 1,\n  \"exceptions\": 2,\n  \"totals\": {\n    \"receipts\": 48250.5,\n    \"fees\": 612.4,\n    \"refunds\": 499,\n    \"payouts\": 33000,\n    \"settlements\": 33000,\n    \"disbursements\": 12000,\n    \"unpaids\": 350\n  },\n  \"openingBalance\": 1203.55,\n  \"closingBalance\": 2992.65,\n  \"balance\": {\n    \"opening\": 1203.55,\n    \"collections\": 48250.5,\n    \"unpaids\": -350,\n    \"refunds\": -499,\n    \"fees\": -612.4,\n    \"disbursements\": -12000,\n    \"settlements\": -33000,\n    \"other\": 0,\n    \"closing\": 2992.65,\n    \"computedClosing\": 2992.65,\n    \"difference\": 0\n  },\n  \"trigger\": \"cron\",\n  \"error\": null,\n  \"createdAt\": \"2026-09-25T02:00:03.000Z\",\n  \"completedAt\": \"2026-09-25T02:04:11.000Z\",\n  \"items\": [\n    {\n      \"id\": \"cmg3line000000000000001\",\n      \"runId\": \"cmg3r7c0n0013run0001abcd\",\n      \"status\": \"matched\",\n      \"matchStatus\": \"matched\",\n      \"category\": \"collection\",\n      \"kind\": \"collection\",\n      \"code\": \"PNC\",\n      \"reference\": \"CP-20260924-9F3A1C7B\",\n      \"externalReference\": \"ORDER-1001\",\n      \"transactionId\": \"cmg3tx00000000000000001\",\n      \"payoutId\": null,\n      \"payoutReference\": null,\n      \"expectedAmount\": 499,\n      \"statementAmount\": 499,\n      \"date\": \"2026-09-24T00:00:00.000Z\",\n      \"description\": \"Pay Now card CP-20260924-9F3A1C7B\",\n      \"note\": \"Confirmed by statement\"\n    },\n    {\n      \"id\": \"cmg3line000000000000002\",\n      \"runId\": \"cmg3r7c0n0013run0001abcd\",\n      \"status\": \"matched\",\n      \"matchStatus\": \"matched\",\n      \"category\": \"fee\",\n      \"kind\": \"fee\",\n      \"code\": \"NSF\",\n      \"reference\": \"CP-20260924-9F3A1C7B\",\n      \"externalReference\": null,\n      \"transactionId\": \"cmg3tx00000000000000001\",\n      \"payoutId\": null,\n      \"payoutReference\": null,\n      \"expectedAmount\": 499,\n      \"statementAmount\": -14.97,\n      \"date\": \"2026-09-24T00:00:00.000Z\",\n      \"description\": \"Pay Now fee CP-20260924-9F3A1C7B\",\n      \"note\": \"Fee 14.97 recorded on CP-20260924-9F3A1C7B\"\n    },\n    {\n      \"id\": \"cmg3line000000000000003\",\n      \"runId\": \"cmg3r7c0n0013run0001abcd\",\n      \"status\": \"amount_mismatch\",\n      \"matchStatus\": \"exception\",\n      \"category\": \"collection\",\n      \"kind\": \"collection\",\n      \"code\": \"PNC\",\n      \"reference\": \"CP-20260924-41D07E2A\",\n      \"externalReference\": \"ORDER-1002\",\n      \"transactionId\": \"cmg3tx00000000000000002\",\n      \"payoutId\": null,\n      \"payoutReference\": null,\n      \"expectedAmount\": 1200,\n      \"statementAmount\": 1100,\n      \"date\": \"2026-09-24T00:00:00.000Z\",\n      \"description\": \"Pay Now card CP-20260924-41D07E2A\",\n      \"note\": \"Amount differs: statement 1100.00 vs transaction 1200.00\"\n    },\n    {\n      \"id\": \"cmg3line000000000000004\",\n      \"runId\": \"cmg3r7c0n0013run0001abcd\",\n      \"status\": \"matched\",\n      \"matchStatus\": \"matched\",\n      \"category\": \"disbursement\",\n      \"kind\": \"payout_paid\",\n      \"code\": \"CRP\",\n      \"reference\": \"PAY-000042\",\n      \"externalReference\": null,\n      \"transactionId\": null,\n      \"payoutId\": \"cmg3payout0000000000042\",\n      \"payoutReference\": \"PAY-000042\",\n      \"expectedAmount\": -1500,\n      \"statementAmount\": -1500,\n      \"date\": \"2026-09-24T00:00:00.000Z\",\n      \"description\": \"Creditor payment | PAY-000042\",\n      \"note\": \"Payout PAY-000042 debited - marked paid\"\n    },\n    {\n      \"id\": \"cmg3line000000000000005\",\n      \"runId\": \"cmg3r7c0n0013run0001abcd\",\n      \"status\": \"unmatched_receipt\",\n      \"matchStatus\": \"unmatched\",\n      \"category\": \"collection\",\n      \"kind\": null,\n      \"code\": \"PNE\",\n      \"reference\": null,\n      \"externalReference\": null,\n      \"transactionId\": null,\n      \"payoutId\": null,\n      \"payoutReference\": null,\n      \"expectedAmount\": null,\n      \"statementAmount\": 75,\n      \"date\": \"2026-09-24T00:00:00.000Z\",\n      \"description\": \"Pay Now EFT\",\n      \"note\": \"Money received with no CentraPoint payment\"\n    },\n    {\n      \"id\": null,\n      \"status\": \"not_received\",\n      \"category\": \"collection\",\n      \"kind\": null,\n      \"reference\": \"CP-20260920-7C21A9F0\",\n      \"externalReference\": \"ORDER-0990\",\n      \"transactionId\": \"cmg3tx00000000000000003\",\n      \"payoutId\": null,\n      \"payoutReference\": null,\n      \"expectedAmount\": 250,\n      \"statementAmount\": null,\n      \"date\": null,\n      \"description\": \"Website hosting\",\n      \"note\": \"Completed in CentraPoint but not on the statement after 3 days\"\n    }\n  ]\n}"
            },
            {
              "name": "403 Plan does not include the API or reconciliation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/runs/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "runs",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3r7c0n0013run0001abcd"
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No run with this ID in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/runs/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "runs",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3r7c0n0013run0001abcd"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Reconciliation run not found\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/runs/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "runs",
                    ":id"
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cmg3r7c0n0013run0001abcd"
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "List statement lines",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/reconciliation/lines",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "reconciliation",
                "lines"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "`open` (unmatched and exceptions), `matched`, `unmatched`, `exception` or `ignored` (raw line status).",
                  "disabled": true
                },
                {
                  "key": "category",
                  "value": "",
                  "description": "Line category.",
                  "disabled": true
                },
                {
                  "key": "account",
                  "value": "acct_3f9a1c7b20d4e5f6",
                  "description": "Only lines of this Netcash account (`acct_…`).",
                  "disabled": true
                },
                {
                  "key": "runId",
                  "value": "",
                  "description": "Only lines of this run.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "",
                  "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the statement line date.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "End date (YYYY-MM-DD, SAST, inclusive) on the statement line date.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                  "disabled": true
                },
                {
                  "key": "startingAfter",
                  "value": "",
                  "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                  "disabled": true
                }
              ]
            },
            "description": "Statement lines across runs, newest line date first, with keyset pagination. Requires the Reconciliation feature (Business plan and above).\n\nReference: https://docs.centrapoint.co.za/reference#listReconciliationLines"
          },
          "response": [
            {
              "name": "200 A page of statement lines",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/lines",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "lines"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "`open` (unmatched and exceptions), `matched`, `unmatched`, `exception` or `ignored` (raw line status).",
                      "disabled": true
                    },
                    {
                      "key": "category",
                      "value": "",
                      "description": "Line category.",
                      "disabled": true
                    },
                    {
                      "key": "account",
                      "value": "acct_3f9a1c7b20d4e5f6",
                      "description": "Only lines of this Netcash account (`acct_…`).",
                      "disabled": true
                    },
                    {
                      "key": "runId",
                      "value": "",
                      "description": "Only lines of this run.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the statement line date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the statement line date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"cmg3line000000000000005\",\n      \"runId\": \"cmg3r7c0n0013run0001abcd\",\n      \"status\": \"unmatched_receipt\",\n      \"matchStatus\": \"unmatched\",\n      \"category\": \"collection\",\n      \"kind\": null,\n      \"code\": \"PNE\",\n      \"reference\": null,\n      \"externalReference\": null,\n      \"transactionId\": null,\n      \"payoutId\": null,\n      \"payoutReference\": null,\n      \"expectedAmount\": null,\n      \"statementAmount\": 75,\n      \"date\": \"2026-09-24T00:00:00.000Z\",\n      \"description\": \"Pay Now EFT\",\n      \"note\": \"Money received with no CentraPoint payment\"\n    }\n  ],\n  \"hasMore\": false,\n  \"nextCursor\": null\n}"
            },
            {
              "name": "400 Unknown status or category, bad date, or an invalid cursor",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/lines",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "lines"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "`open` (unmatched and exceptions), `matched`, `unmatched`, `exception` or `ignored` (raw line status).",
                      "disabled": true
                    },
                    {
                      "key": "category",
                      "value": "",
                      "description": "Line category.",
                      "disabled": true
                    },
                    {
                      "key": "account",
                      "value": "acct_3f9a1c7b20d4e5f6",
                      "description": "Only lines of this Netcash account (`acct_…`).",
                      "disabled": true
                    },
                    {
                      "key": "runId",
                      "value": "",
                      "description": "Only lines of this run.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the statement line date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the statement line date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"invalid_request\",\n  \"message\": \"status must be one of open, matched, unmatched, exception, ignored\"\n}"
            },
            {
              "name": "403 Plan does not include the API or reconciliation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/lines",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "lines"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "`open` (unmatched and exceptions), `matched`, `unmatched`, `exception` or `ignored` (raw line status).",
                      "disabled": true
                    },
                    {
                      "key": "category",
                      "value": "",
                      "description": "Line category.",
                      "disabled": true
                    },
                    {
                      "key": "account",
                      "value": "acct_3f9a1c7b20d4e5f6",
                      "description": "Only lines of this Netcash account (`acct_…`).",
                      "disabled": true
                    },
                    {
                      "key": "runId",
                      "value": "",
                      "description": "Only lines of this run.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the statement line date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the statement line date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "404 No Netcash account with this `account` id in your organisation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/lines",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "lines"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "`open` (unmatched and exceptions), `matched`, `unmatched`, `exception` or `ignored` (raw line status).",
                      "disabled": true
                    },
                    {
                      "key": "category",
                      "value": "",
                      "description": "Line category.",
                      "disabled": true
                    },
                    {
                      "key": "account",
                      "value": "acct_3f9a1c7b20d4e5f6",
                      "description": "Only lines of this Netcash account (`acct_…`).",
                      "disabled": true
                    },
                    {
                      "key": "runId",
                      "value": "",
                      "description": "Only lines of this run.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the statement line date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the statement line date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"not_found\",\n  \"message\": \"Account not found\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/lines",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "lines"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "",
                      "description": "`open` (unmatched and exceptions), `matched`, `unmatched`, `exception` or `ignored` (raw line status).",
                      "disabled": true
                    },
                    {
                      "key": "category",
                      "value": "",
                      "description": "Line category.",
                      "disabled": true
                    },
                    {
                      "key": "account",
                      "value": "acct_3f9a1c7b20d4e5f6",
                      "description": "Only lines of this Netcash account (`acct_…`).",
                      "disabled": true
                    },
                    {
                      "key": "runId",
                      "value": "",
                      "description": "Only lines of this run.",
                      "disabled": true
                    },
                    {
                      "key": "from",
                      "value": "",
                      "description": "Start date (YYYY-MM-DD, SAST, inclusive) on the statement line date.",
                      "disabled": true
                    },
                    {
                      "key": "to",
                      "value": "",
                      "description": "End date (YYYY-MM-DD, SAST, inclusive) on the statement line date.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "description": "1–100, default 20. Out-of-range values are clamped; invalid values fall back to 20.",
                      "disabled": true
                    },
                    {
                      "key": "startingAfter",
                      "value": "",
                      "description": "Cursor: the `id` of the last item of the previous page (`nextCursor`). Must be an id from the same list.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        },
        {
          "name": "List Netcash accounts",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/reconciliation/accounts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "reconciliation",
                "accounts"
              ]
            },
            "description": "Your Netcash accounts (Netcash gateways grouped by Account service key) with the last run, open items and a 30-day balance view. Requires the Reconciliation feature (Business plan and above).\n\nReference: https://docs.centrapoint.co.za/reference#listReconciliationAccounts"
          },
          "response": [
            {
              "name": "200 Accounts",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/accounts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "accounts"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"acct_3f9a1c7b20d4e5f6\",\n      \"object\": \"reconciliation_account\",\n      \"providers\": [\n        {\n          \"id\": \"cmg3prov0000paynow000001\",\n          \"name\": \"Card payments\",\n          \"type\": \"netcash_paynow\"\n        },\n        {\n          \"id\": \"cmg3prov0000recur0000002\",\n          \"name\": \"Subscriptions\",\n          \"type\": \"netcash_paynow\"\n        },\n        {\n          \"id\": \"cmg3prov0000credit000003\",\n          \"name\": \"Payouts\",\n          \"type\": \"netcash_creditor\"\n        }\n      ],\n      \"lastRun\": {\n        \"id\": \"cmg3r7c0n0013run0001abcd\",\n        \"status\": \"completed\",\n        \"startedAt\": \"2026-09-25T02:00:03.000Z\",\n        \"finishedAt\": \"2026-09-25T02:04:11.000Z\",\n        \"error\": null\n      },\n      \"lastStatement\": {\n        \"runId\": \"cmg3r7c0n0013run0001abcd\",\n        \"periodStart\": \"2026-09-23T22:00:00.000Z\",\n        \"periodEnd\": \"2026-09-24T22:00:00.000Z\"\n      },\n      \"unmatched\": 1,\n      \"unmatchedAmount\": 75,\n      \"exceptions\": 1,\n      \"notReceived\": 1,\n      \"balance\": {\n        \"periodDays\": 30,\n        \"opening\": 1203.55,\n        \"collections\": 48250.5,\n        \"unpaids\": -350,\n        \"refunds\": -499,\n        \"fees\": -612.4,\n        \"disbursements\": -12000,\n        \"settlements\": -33000,\n        \"other\": 0,\n        \"closing\": 2992.65,\n        \"computedClosing\": 2992.65,\n        \"difference\": 0\n      }\n    }\n  ]\n}"
            },
            {
              "name": "403 Plan does not include the API or reconciliation",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/accounts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "accounts"
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"This feature is not included in your plan\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/reconciliation/accounts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "reconciliation",
                    "accounts"
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Accounting",
      "description": "Accounting-system sign-up (referral) links for your own apps.\n\nDocs: https://docs.centrapoint.co.za/accounting",
      "item": [
        {
          "name": "List accounting referral links",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/accounting/referral-links",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "accounting",
                "referral-links"
              ]
            },
            "description": "Returns tracked sign-up links for the accounting systems CentraPoint partners with, so you can show a \"Don't have Xero? Sign up\" link in your own app. Only active partner programmes are returned; the list can be empty. Each `url` is specific to your organisation. Available on any plan with API access: signing up for an accounting system does not require CentraPoint's accounting sync feature.\n\nReference: https://docs.centrapoint.co.za/reference#listAccountingReferralLinks"
          },
          "response": [
            {
              "name": "200 Active referral links",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/accounting/referral-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "accounting",
                    "referral-links"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"connector\": \"xero\",\n      \"name\": \"Xero\",\n      \"program\": \"Xero App Partner\",\n      \"url\": \"https://app.centrapoint.co.za/r/accounting/xero?s=cpQ2VudHJhUG9pbnQx.bG9uZy1zaWduYXR1cmUx\"\n    },\n    {\n      \"connector\": \"zoho_books\",\n      \"name\": \"Zoho Books\",\n      \"program\": \"Zoho Affiliate\",\n      \"url\": \"https://app.centrapoint.co.za/r/accounting/zoho_books?s=cpQ2VudHJhUG9pbnQx.c2Vjb25kLXNpZ25hdHVyZQ\"\n    }\n  ]\n}"
            },
            {
              "name": "403 API access is not included in your plan",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/accounting/referral-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "accounting",
                    "referral-links"
                  ]
                }
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"plan_restricted\",\n  \"message\": \"API access is not included in your plan\"\n}"
            },
            {
              "name": "500 Unexpected server error",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/accounting/referral-links",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "accounting",
                    "referral-links"
                  ]
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"internal_error\",\n  \"message\": \"An unexpected error occurred. Please try again or contact support.\"\n}"
            }
          ]
        }
      ]
    }
  ]
}
