> ## Documentation Index
> Fetch the complete documentation index at: https://docs.voyantcloud.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Netopia Notify Webhook

> Receive signed payment status updates from Netopia and confirm payment sessions.

## Method

`POST` `/v1/integrations/netopia/notify`

## Body Parameters

The payload mirrors Netopia’s JSON webhook structure. At minimum it contains:

<ParamField name="order.orderID" type="string" required>Order identifier (maps to Voyant `paymentId`).</ParamField>
<ParamField name="payment.status" type="number">Netopia status code (`3`/`5` treated as success).</ParamField>
<ParamField name="payment.ntpID" type="string">Netopia transaction ID.</ParamField>
<ParamField name="payment.amount" type="number">Paid amount.</ParamField>
<ParamField name="payment.currency" type="string">Transaction currency.</ParamField>

## Headers

None (endpoint is unauthenticated). Protect it via provider IP allow lists and signature verification.

## Request Example

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST https://api.voyantcloud.com/v1/integrations/netopia/notify \
    -H "content-type: application/json" \
    -d '{
      "order": { "orderID": "ORDER-20250301-0001" },
      "payment": {
        "status": 3,
        "ntpID": "9876543210",
        "amount": 8450,
        "currency": "RON",
        "message": "Payment authorized"
      }
    }'
  ```

  ```javascript Node.js theme={null}
  await fetch("https://api.voyantcloud.com/v1/integrations/netopia/notify", {
    method: "POST",
    headers: { "content-type": "application/json" },
    body: JSON.stringify({
      order: { orderID: "ORDER-20250301-0001" },
      payment: { status: 3, ntpID: "9876543210", amount: 8450, currency: "RON" },
    }),
  })
  ```

  ```python Python theme={null}
  import requests

  payload = {
    "order": {"orderID": "ORDER-20250301-0001"},
    "payment": {
      "status": 3,
      "ntpID": "9876543210",
      "amount": 8450,
      "currency": "RON"
    }
  }

  requests.post(
    "https://api.voyantcloud.com/v1/integrations/netopia/notify",
    headers={"content-type": "application/json"},
    json=payload,
  )
  ```
</RequestExample>

## Response

<ResponseExample>
  ```json 200 OK theme={null}
  { "ok": true }
  ```

  ```json 400 Bad Request theme={null}
  { "error": "Invalid payload", "requestId": "req_abcdef" }
  ```
</ResponseExample>

<Tip>Netopia statuses `3` and `5` mark the session as confirmed and trigger the Trigger.dev orchestrator for invoices/contracts. All webhook payloads are stored in `payments.webhook_events` for auditing.</Tip>
