Rybbit
APIStats

Funnels

Create and analyze multi-step conversion funnels

See the API Reference for authentication, common parameters, and filters.

Endpoints


Get Funnels

GET /api/funnels/:site

Returns all saved funnels for a site.

Path Parameters

Prop

Type

Response

Prop

Type

Funnel Object

Prop

Type

Request
curl -X GET "https://api.rybbit.io/api/funnels/123" \
  -H "Authorization: Bearer your_api_key_here"
Request
const response = await fetch(
  'https://api.rybbit.io/api/funnels/123',
  {
    headers: {
      'Authorization': 'Bearer your_api_key_here'
    }
  }
);

const data = await response.json();
Request
import requests

response = requests.get(
    'https://api.rybbit.io/api/funnels/123',
    headers={
        'Authorization': 'Bearer your_api_key_here'
    }
)

data = response.json()
Request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.rybbit.io/api/funnels/123');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer your_api_key_here'
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
Request
require 'net/http'
require 'json'

uri = URI('https://api.rybbit.io/api/funnels/123')
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer your_api_key_here'

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

data = JSON.parse(response.body)
Request
package main

import (
    "encoding/json"
    "io"
    "net/http"
)

func main() {
    client := &http.Client{}
    req, _ := http.NewRequest("GET", "https://api.rybbit.io/api/funnels/123", nil)
    req.Header.Set("Authorization", "Bearer your_api_key_here")

    resp, _ := client.Do(req)
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    var data map[string]interface{}
    json.Unmarshal(body, &data)
}
Request
use reqwest;
use serde_json::Value;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::Client::new();
    let response = client
        .get("https://api.rybbit.io/api/funnels/123")
        .header("Authorization", "Bearer your_api_key_here")
        .send()
        .await?;

    let data: Value = response.json().await?;
    Ok(())
}
Request
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.rybbit.io/api/funnels/123"))
    .header("Authorization", "Bearer your_api_key_here")
    .GET()
    .build();

HttpResponse<String> response = client.send(request,
    HttpResponse.BodyHandlers.ofString());
String data = response.body();
Request
using System.Net.Http;
using System.Net.Http.Headers;

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "your_api_key_here");

var response = await client.GetAsync(
    "https://api.rybbit.io/api/funnels/123");
var data = await response.Content.ReadAsStringAsync();
Response
{
  "data": [
    {
      "id": 1,
      "name": "Signup Funnel",
      "steps": [
        { "type": "page", "value": "/", "name": "Homepage" },
        { "type": "page", "value": "/pricing", "name": "Pricing" },
        { "type": "page", "value": "/signup", "name": "Signup" },
        { "type": "page", "value": "/signup/complete", "name": "Complete" }
      ],
      "createdAt": "2024-01-10T12:00:00.000Z",
      "updatedAt": "2024-01-15T09:30:00.000Z"
    }
  ]
}

Analyze Funnel

POST /api/funnels/analyze/:site

Analyzes a funnel and returns step-by-step conversion data. Sessions must complete steps in order (step 2 must occur after step 1, etc.).

Path Parameters

Prop

Type

Query Parameters

Accepts all Common Parameters (time and filters).

Request Body

Prop

Type

FunnelStep Object

Prop

Type

Response

Prop

Type

FunnelStepResult Object

Prop

Type

Request
curl -X POST "https://api.rybbit.io/api/funnels/analyze/123?start_date=2024-01-01&end_date=2024-01-31" \
  -H "Authorization: Bearer your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "steps": [
      { "type": "page", "value": "/", "name": "Homepage" },
      { "type": "page", "value": "/pricing", "name": "Pricing" },
      { "type": "page", "value": "/signup", "name": "Signup" },
      { "type": "event", "value": "signup_complete", "name": "Complete" }
    ]
  }'
Request
const response = await fetch(
  'https://api.rybbit.io/api/funnels/analyze/123?start_date=2024-01-01&end_date=2024-01-31',
  {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer your_api_key_here',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      steps: [
        { type: 'page', value: '/', name: 'Homepage' },
        { type: 'page', value: '/pricing', name: 'Pricing' },
        { type: 'page', value: '/signup', name: 'Signup' },
        { type: 'event', value: 'signup_complete', name: 'Complete' }
      ]
    })
  }
);

const data = await response.json();
Request
import requests

response = requests.post(
    'https://api.rybbit.io/api/funnels/analyze/123',
    params={
        'start_date': '2024-01-01',
        'end_date': '2024-01-31'
    },
    json={
        'steps': [
            { 'type': 'page', 'value': '/', 'name': 'Homepage' },
            { 'type': 'page', 'value': '/pricing', 'name': 'Pricing' },
            { 'type': 'page', 'value': '/signup', 'name': 'Signup' },
            { 'type': 'event', 'value': 'signup_complete', 'name': 'Complete' }
        ]
    },
    headers={
        'Authorization': 'Bearer your_api_key_here'
    }
)

data = response.json()
Request
$body = [
    'steps' => [
        ['type' => 'page', 'value' => '/', 'name' => 'Homepage'],
        ['type' => 'page', 'value' => '/pricing', 'name' => 'Pricing'],
        ['type' => 'page', 'value' => '/signup', 'name' => 'Signup'],
        ['type' => 'event', 'value' => 'signup_complete', 'name' => 'Complete']
    ]
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.rybbit.io/api/funnels/analyze/123?start_date=2024-01-01&end_date=2024-01-31');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer your_api_key_here',
    'Content-Type: application/json'
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
Request
require 'net/http'
require 'json'

uri = URI('https://api.rybbit.io/api/funnels/analyze/123?start_date=2024-01-01&end_date=2024-01-31')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer your_api_key_here'
request['Content-Type'] = 'application/json'
request.body = {
  steps: [
    { type: 'page', value: '/', name: 'Homepage' },
    { type: 'page', value: '/pricing', name: 'Pricing' },
    { type: 'page', value: '/signup', name: 'Signup' },
    { type: 'event', value: 'signup_complete', name: 'Complete' }
  ]
}.to_json

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

data = JSON.parse(response.body)
Request
package main

import (
    "bytes"
    "encoding/json"
    "io"
    "net/http"
)

func main() {
    body := map[string]interface{}{
        "steps": []map[string]string{
            {"type": "page", "value": "/", "name": "Homepage"},
            {"type": "page", "value": "/pricing", "name": "Pricing"},
            {"type": "page", "value": "/signup", "name": "Signup"},
            {"type": "event", "value": "signup_complete", "name": "Complete"},
        },
    }
    jsonBody, _ := json.Marshal(body)

    client := &http.Client{}
    req, _ := http.NewRequest("POST", "https://api.rybbit.io/api/funnels/analyze/123?start_date=2024-01-01&end_date=2024-01-31", bytes.NewBuffer(jsonBody))
    req.Header.Set("Authorization", "Bearer your_api_key_here")
    req.Header.Set("Content-Type", "application/json")

    resp, _ := client.Do(req)
    defer resp.Body.Close()

    respBody, _ := io.ReadAll(resp.Body)
    var data map[string]interface{}
    json.Unmarshal(respBody, &data)
}
Request
use reqwest;
use serde_json::{json, Value};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let body = json!({
        "steps": [
            {"type": "page", "value": "/", "name": "Homepage"},
            {"type": "page", "value": "/pricing", "name": "Pricing"},
            {"type": "page", "value": "/signup", "name": "Signup"},
            {"type": "event", "value": "signup_complete", "name": "Complete"}
        ]
    });

    let client = reqwest::Client::new();
    let response = client
        .post("https://api.rybbit.io/api/funnels/analyze/123?start_date=2024-01-01&end_date=2024-01-31")
        .header("Authorization", "Bearer your_api_key_here")
        .header("Content-Type", "application/json")
        .json(&body)
        .send()
        .await?;

    let data: Value = response.json().await?;
    Ok(())
}
Request
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

String json = """
{
  "steps": [
    {"type": "page", "value": "/", "name": "Homepage"},
    {"type": "page", "value": "/pricing", "name": "Pricing"},
    {"type": "page", "value": "/signup", "name": "Signup"},
    {"type": "event", "value": "signup_complete", "name": "Complete"}
  ]
}
""";

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.rybbit.io/api/funnels/analyze/123?start_date=2024-01-01&end_date=2024-01-31"))
    .header("Authorization", "Bearer your_api_key_here")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(json))
    .build();

HttpResponse<String> response = client.send(request,
    HttpResponse.BodyHandlers.ofString());
String data = response.body();
Request
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;

var body = new
{
    steps = new[]
    {
        new { type = "page", value = "/", name = "Homepage" },
        new { type = "page", value = "/pricing", name = "Pricing" },
        new { type = "page", value = "/signup", name = "Signup" },
        new { type = "event", value = "signup_complete", name = "Complete" }
    }
};

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "your_api_key_here");

var content = new StringContent(
    JsonSerializer.Serialize(body),
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync(
    "https://api.rybbit.io/api/funnels/analyze/123?start_date=2024-01-01&end_date=2024-01-31",
    content);
var data = await response.Content.ReadAsStringAsync();
Response
{
  "data": [
    {
      "step_number": 1,
      "step_name": "Homepage",
      "visitors": 10000,
      "conversion_rate": 100,
      "dropoff_rate": 0
    },
    {
      "step_number": 2,
      "step_name": "Pricing",
      "visitors": 4500,
      "conversion_rate": 45,
      "dropoff_rate": 55
    },
    {
      "step_number": 3,
      "step_name": "Signup",
      "visitors": 1800,
      "conversion_rate": 18,
      "dropoff_rate": 60
    },
    {
      "step_number": 4,
      "step_name": "Complete",
      "visitors": 720,
      "conversion_rate": 7.2,
      "dropoff_rate": 60
    }
  ]
}

Get Funnel Step Sessions

POST /api/funnels/:stepNumber/sessions/:site

Returns sessions that either reached or dropped off at a specific funnel step. Useful for analyzing user behavior at each stage.

Path Parameters

Prop

Type

Query Parameters

Accepts all Common Parameters plus the following:

Prop

Type

Request Body

Prop

Type

Response

Prop

Type

Get sessions that dropped off at step 2
curl -X POST "https://api.rybbit.io/api/funnels/2/sessions/123?mode=dropped&page=1" \
  -H "Authorization: Bearer your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "steps": [
      { "type": "page", "value": "/", "name": "Homepage" },
      { "type": "page", "value": "/pricing", "name": "Pricing" },
      { "type": "page", "value": "/signup", "name": "Signup" }
    ]
  }'
Get sessions that reached step 3
const response = await fetch(
  'https://api.rybbit.io/api/funnels/3/sessions/123?mode=reached&page=1',
  {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer your_api_key_here',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      steps: [
        { type: 'page', value: '/', name: 'Homepage' },
        { type: 'page', value: '/pricing', name: 'Pricing' },
        { type: 'page', value: '/signup', name: 'Signup' }
      ]
    })
  }
);

const data = await response.json();
Request
import requests

response = requests.post(
    'https://api.rybbit.io/api/funnels/2/sessions/123',
    params={
        'mode': 'dropped',
        'page': 1
    },
    json={
        'steps': [
            { 'type': 'page', 'value': '/', 'name': 'Homepage' },
            { 'type': 'page', 'value': '/pricing', 'name': 'Pricing' },
            { 'type': 'page', 'value': '/signup', 'name': 'Signup' }
        ]
    },
    headers={
        'Authorization': 'Bearer your_api_key_here'
    }
)

data = response.json()
Request
$body = [
    'steps' => [
        ['type' => 'page', 'value' => '/', 'name' => 'Homepage'],
        ['type' => 'page', 'value' => '/pricing', 'name' => 'Pricing'],
        ['type' => 'page', 'value' => '/signup', 'name' => 'Signup']
    ]
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.rybbit.io/api/funnels/2/sessions/123?mode=dropped&page=1');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer your_api_key_here',
    'Content-Type: application/json'
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
Request
require 'net/http'
require 'json'

uri = URI('https://api.rybbit.io/api/funnels/2/sessions/123?mode=dropped&page=1')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer your_api_key_here'
request['Content-Type'] = 'application/json'
request.body = {
  steps: [
    { type: 'page', value: '/', name: 'Homepage' },
    { type: 'page', value: '/pricing', name: 'Pricing' },
    { type: 'page', value: '/signup', name: 'Signup' }
  ]
}.to_json

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

data = JSON.parse(response.body)
Request
body := map[string]interface{}{
    "steps": []map[string]string{
        {"type": "page", "value": "/", "name": "Homepage"},
        {"type": "page", "value": "/pricing", "name": "Pricing"},
        {"type": "page", "value": "/signup", "name": "Signup"},
    },
}
jsonBody, _ := json.Marshal(body)

req, _ := http.NewRequest("POST", "https://api.rybbit.io/api/funnels/2/sessions/123?mode=dropped&page=1", bytes.NewBuffer(jsonBody))
req.Header.Set("Authorization", "Bearer your_api_key_here")
req.Header.Set("Content-Type", "application/json")

client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()

var data map[string]interface{}
json.NewDecoder(resp.Body).Decode(&data)
Request
let body = serde_json::json!({
    "steps": [
        {"type": "page", "value": "/", "name": "Homepage"},
        {"type": "page", "value": "/pricing", "name": "Pricing"},
        {"type": "page", "value": "/signup", "name": "Signup"}
    ]
});

let client = reqwest::Client::new();
let res = client
    .post("https://api.rybbit.io/api/funnels/2/sessions/123?mode=dropped&page=1")
    .header("Authorization", "Bearer your_api_key_here")
    .json(&body)
    .send()
    .await?;

let data: serde_json::Value = res.json().await?;
Request
String json = """
{
  "steps": [
    {"type": "page", "value": "/", "name": "Homepage"},
    {"type": "page", "value": "/pricing", "name": "Pricing"},
    {"type": "page", "value": "/signup", "name": "Signup"}
  ]
}
""";

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.rybbit.io/api/funnels/2/sessions/123?mode=dropped&page=1"))
    .header("Authorization", "Bearer your_api_key_here")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(json))
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
Request
var body = new
{
    steps = new[]
    {
        new { type = "page", value = "/", name = "Homepage" },
        new { type = "page", value = "/pricing", name = "Pricing" },
        new { type = "page", value = "/signup", name = "Signup" }
    }
};

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer your_api_key_here");

var content = new StringContent(
    JsonSerializer.Serialize(body),
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync(
    "https://api.rybbit.io/api/funnels/2/sessions/123?mode=dropped&page=1",
    content);
var data = await response.Content.ReadAsStringAsync();
Response
{
  "data": [
    {
      "session_id": "sess_abc123",
      "user_id": "user_xyz789",
      "country": "US",
      "browser": "Chrome",
      "operating_system": "macOS",
      "device_type": "desktop",
      "entry_page": "/",
      "exit_page": "/pricing",
      "pageviews": 3,
      "session_duration": 125,
      "session_start": "2024-01-31T14:00:00.000Z",
      "session_end": "2024-01-31T14:02:05.000Z",
      "referrer": "https://google.com",
      "channel": "organic"
    }
  ]
}

Create Funnel

POST /api/funnels/:site

Creates or updates a saved funnel. If reportId is provided, updates the existing funnel.

Path Parameters

Prop

Type

Request Body

Prop

Type

Response

Prop

Type

Create New Funnel
curl -X POST "https://api.rybbit.io/api/funnels/123" \
  -H "Authorization: Bearer your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Checkout Funnel",
    "steps": [
      { "type": "page", "value": "/products/*", "name": "Product Page" },
      { "type": "page", "value": "/cart", "name": "Cart" },
      { "type": "page", "value": "/checkout", "name": "Checkout" },
      { "type": "event", "value": "purchase", "name": "Purchase" }
    ]
  }'
Update Existing Funnel
const response = await fetch(
  'https://api.rybbit.io/api/funnels/123',
  {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer your_api_key_here',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      reportId: 1,  // Update existing funnel
      name: 'Checkout Funnel (Updated)',
      steps: [
        { type: 'page', value: '/products/*', name: 'Product Page' },
        { type: 'page', value: '/cart', name: 'Cart' },
        { type: 'page', value: '/checkout', name: 'Checkout' },
        { type: 'page', value: '/checkout/success', name: 'Success' }
      ]
    })
  }
);

const data = await response.json();
Request
import requests

response = requests.post(
    'https://api.rybbit.io/api/funnels/123',
    json={
        'name': 'Onboarding Funnel',
        'steps': [
            { 'type': 'page', 'value': '/signup', 'name': 'Signup' },
            { 'type': 'event', 'value': 'account_created', 'name': 'Account Created' },
            { 'type': 'page', 'value': '/onboarding/*', 'name': 'Onboarding' },
            { 'type': 'event', 'value': 'onboarding_complete', 'name': 'Complete' }
        ]
    },
    headers={
        'Authorization': 'Bearer your_api_key_here'
    }
)

data = response.json()
Request
$body = [
    'name' => 'Checkout Funnel',
    'steps' => [
        ['type' => 'page', 'value' => '/products/*', 'name' => 'Product Page'],
        ['type' => 'page', 'value' => '/cart', 'name' => 'Cart'],
        ['type' => 'page', 'value' => '/checkout', 'name' => 'Checkout'],
        ['type' => 'event', 'value' => 'purchase', 'name' => 'Purchase']
    ]
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.rybbit.io/api/funnels/123');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer your_api_key_here',
    'Content-Type: application/json'
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
Request
require 'net/http'
require 'json'

uri = URI('https://api.rybbit.io/api/funnels/123')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer your_api_key_here'
request['Content-Type'] = 'application/json'
request.body = {
  name: 'Checkout Funnel',
  steps: [
    { type: 'page', value: '/products/*', name: 'Product Page' },
    { type: 'page', value: '/cart', name: 'Cart' },
    { type: 'page', value: '/checkout', name: 'Checkout' },
    { type: 'event', value: 'purchase', name: 'Purchase' }
  ]
}.to_json

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

data = JSON.parse(response.body)
Request
body := map[string]interface{}{
    "name": "Checkout Funnel",
    "steps": []map[string]string{
        {"type": "page", "value": "/products/*", "name": "Product Page"},
        {"type": "page", "value": "/cart", "name": "Cart"},
        {"type": "page", "value": "/checkout", "name": "Checkout"},
        {"type": "event", "value": "purchase", "name": "Purchase"},
    },
}
jsonBody, _ := json.Marshal(body)

req, _ := http.NewRequest("POST", "https://api.rybbit.io/api/funnels/123", bytes.NewBuffer(jsonBody))
req.Header.Set("Authorization", "Bearer your_api_key_here")
req.Header.Set("Content-Type", "application/json")

client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()

var data map[string]interface{}
json.NewDecoder(resp.Body).Decode(&data)
Request
let body = serde_json::json!({
    "name": "Checkout Funnel",
    "steps": [
        {"type": "page", "value": "/products/*", "name": "Product Page"},
        {"type": "page", "value": "/cart", "name": "Cart"},
        {"type": "page", "value": "/checkout", "name": "Checkout"},
        {"type": "event", "value": "purchase", "name": "Purchase"}
    ]
});

let client = reqwest::Client::new();
let res = client
    .post("https://api.rybbit.io/api/funnels/123")
    .header("Authorization", "Bearer your_api_key_here")
    .json(&body)
    .send()
    .await?;

let data: serde_json::Value = res.json().await?;
Request
String json = """
{
  "name": "Checkout Funnel",
  "steps": [
    {"type": "page", "value": "/products/*", "name": "Product Page"},
    {"type": "page", "value": "/cart", "name": "Cart"},
    {"type": "page", "value": "/checkout", "name": "Checkout"},
    {"type": "event", "value": "purchase", "name": "Purchase"}
  ]
}
""";

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.rybbit.io/api/funnels/123"))
    .header("Authorization", "Bearer your_api_key_here")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(json))
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
Request
var body = new
{
    name = "Checkout Funnel",
    steps = new[]
    {
        new { type = "page", value = "/products/*", name = "Product Page" },
        new { type = "page", value = "/cart", name = "Cart" },
        new { type = "page", value = "/checkout", name = "Checkout" },
        new { type = "event", value = "purchase", name = "Purchase" }
    }
};

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer your_api_key_here");

var content = new StringContent(
    JsonSerializer.Serialize(body),
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://api.rybbit.io/api/funnels/123", content);
var data = await response.Content.ReadAsStringAsync();
Response
{
  "success": true,
  "funnelId": 2
}

Delete Funnel

DELETE /api/funnels/:funnelId/:site

Deletes a saved funnel. This action cannot be undone.

Path Parameters

Prop

Type

Response

Prop

Type

Request
curl -X DELETE "https://api.rybbit.io/api/funnels/1/123" \
  -H "Authorization: Bearer your_api_key_here"
Request
const response = await fetch(
  'https://api.rybbit.io/api/funnels/1/123',
  {
    method: 'DELETE',
    headers: {
      'Authorization': 'Bearer your_api_key_here'
    }
  }
);

const data = await response.json();
Request
import requests

response = requests.delete(
    'https://api.rybbit.io/api/funnels/1/123',
    headers={
        'Authorization': 'Bearer your_api_key_here'
    }
)

data = response.json()
Request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.rybbit.io/api/funnels/1/123');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer your_api_key_here'
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
Request
require 'net/http'
require 'json'

uri = URI('https://api.rybbit.io/api/funnels/1/123')
request = Net::HTTP::Delete.new(uri)
request['Authorization'] = 'Bearer your_api_key_here'

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

data = JSON.parse(response.body)
Request
req, _ := http.NewRequest("DELETE", "https://api.rybbit.io/api/funnels/1/123", nil)
req.Header.Set("Authorization", "Bearer your_api_key_here")

client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()

var data map[string]interface{}
json.NewDecoder(resp.Body).Decode(&data)
Request
let client = reqwest::Client::new();
let res = client
    .delete("https://api.rybbit.io/api/funnels/1/123")
    .header("Authorization", "Bearer your_api_key_here")
    .send()
    .await?;

let data: serde_json::Value = res.json().await?;
Request
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.rybbit.io/api/funnels/1/123"))
    .header("Authorization", "Bearer your_api_key_here")
    .DELETE()
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
Request
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer your_api_key_here");

var response = await client.DeleteAsync("https://api.rybbit.io/api/funnels/1/123");
var data = await response.Content.ReadAsStringAsync();
Response
{
  "success": true
}