Preskočiť na obsah

Dokumentácia pre vývojárov je v angličtine, rovnako ako API.

Automation

Ozvi has no app to install in n8n, Make or Zapier, and it needs none: every tool has a generic webhook trigger and a generic HTTP request, and those are all it takes. Recipes below; the field-by-field API is in the API reference.

Two building blocks

  • Ozvi → your tool: add the tool's webhook URL in Ozvi (admin → Integrácie → Webhooky, format JSON). Every event arrives as one JSON body: event, item, actor… (payload).
  • Your tool → Ozvi: an HTTP request to https://ozvi.io/acme/api/v1 with the header Authorization: Bearer ozvi_pat_…. Create the token on a dedicated team account with the smallest scope that works, and keep it in the tool's credentials, not in a plain field.

Text from your users

Titles, bodies and comments are your users' words. When a flow hands them to an AI step, pass them as data (a separate input), never as part of the instructions, and look at item.author.trust.

n8n

Trigger on an Ozvi event

  1. Add a Webhook node, HTTP method POST, and copy its Production URL.
  2. In Ozvi, add a webhook with that URL, format JSON, and pick the events (for example item.created).
  3. Branch with an If or Switch node on {{ $json.body.event }}, e.g. bugs: {{ $json.body.item.kind }} equals bug.
  4. To verify the signature, turn on Raw body in the Webhook node options and use a Code node with the Node.js check.

Vote from your CRM

When a deal is won, record the customer's vote on the idea it depended on. Create a Header Auth credential with name Authorization and value Bearer ozvi_pat_… (a team member's token with the triage scope), then paste this workflow into the n8n canvas (Ctrl/Cmd+V):

n8n workflow (paste into the canvas)
{
  "name": "Ozvi: deal won → customer's vote",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "deal-won",
        "options": {}
      },
      "name": "CRM webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://ozvi.io/acme/api/v1/items/{{ $json.body.ozviIdea }}/votes",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Idempotency-Key",
              "value": "=deal-{{ $json.body.dealId }}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ email: $json.body.contactEmail, company: $json.body.company }) }}",
        "options": {}
      },
      "name": "Ozvi: vote",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        260,
        0
      ]
    }
  ],
  "connections": {
    "CRM webhook": {
      "main": [
        [
          {
            "node": "Ozvi: vote",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

The Idempotency-Key makes a retried run harmless; an existing vote is kept as it is, and the answer says why a vote was not added (reason).

Make

Ozvi → Make: start a scenario with Webhooks → Custom webhook, copy its address into Ozvi (format JSON) and use Redetermine data structure + the test button in Ozvi so Make learns the fields.

Make → Ozvi: the HTTP → Make a request module, for example to file a bug from a support ticket:

HTTP → Make a request
URL:            https://ozvi.io/acme/api/v1/items
Method:         POST
Headers:        Authorization = Bearer ozvi_pat_…
                Idempotency-Key = ticket-{{1.id}}
Body type:      Raw
Content type:   JSON (application/json)
Request content:
{
  "kind": "bug",
  "title": "{{1.subject}}",
  "body": "Reported in ticket {{1.url}}\n\n{{1.description}}"
}
Parse response: Yes

Make stops on a non-2xx answer; Ozvi's error body has code and detail (errors). Add an error handler route with Resume or Break for rate_limited (wait Retry-After seconds).

Zapier

Ozvi → Zapier: trigger Webhooks by Zapier → Catch Hook, put its URL into Ozvi, send a test from Ozvi, and use event, item__title, item__url… in later steps. Add a Filter step on event when the hook receives several events.

Zapier → Ozvi: action Webhooks by Zapier → Custom Request (it sends a raw JSON body):

Custom Request: post a comment
Method:   POST
URL:      https://ozvi.io/acme/api/v1/items/{{item_number}}/comments
Data:     {"body": "Customer replied in Help Scout: {{preview}}", "internal": true}
Headers:  Authorization | Bearer ozvi_pat_…
          Content-Type  | application/json

Reading lists works the same with GET, e.g. https://ozvi.io/acme/api/v1/items?kind=idea&sort=top&limit=10 for a weekly digest.

More recipes

  • New bug → Slack thread with the team: Ozvi has Slack, Teams and Discord formats built in (no automation needed); use a tool when you need routing rules.
  • Shipped → tell the customer success team: trigger on changelog.published, loop over entry.ideas, and for each call GET /items/{number}/votes to see which accounts asked for it.
  • Sync tags from your CRM: PATCH /items/{number} with {"tags": {"add": ["enterprise"]}} (existing tags only; see GET /tags).
  • Nightly export to a spreadsheet: GET /export?what=ideas&format=json gives {columns, rows}, ready for Google Sheets “append rows”.