Goals

Create Goal

Creates a new goal for tracking conversions.

POST /api/sites/:site/goals

Creates a new goal for tracking conversions. Requires the member role or above on the site (the goals:write permission). Returns 201 on success and 400 with details when the body fails validation.

Path Parameters

Prop

Type

Request Body

Prop

Type

GoalConfig Object

Which fields apply depends on goalType. Path goals need pathPattern and event goals need eventName; autocapture goals need nothing, and match every event of their type when valuePattern is omitted.

Prop

Type

Response

Prop

Type

Path Goal
curl -X POST "https://app.rybbit.io/api/sites/1/goals" \
  -H "Authorization: Bearer your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Checkout Complete",
    "goalType": "path",
    "config": {
      "pathPattern": "/checkout/success"
    }
  }'
Event Goal
const response = await fetch(
  'https://app.rybbit.io/api/sites/1/goals',
  {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer your_api_key_here',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      name: 'Purchase Made',
      goalType: 'event',
      config: {
        eventName: 'purchase',
        eventPropertyKey: 'plan',
        eventPropertyValue: 'pro'
      }
    })
  }
);

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

response = requests.post(
    'https://app.rybbit.io/api/sites/1/goals',
    json={
        'name': 'Signup Complete',
        'goalType': 'path',
        'config': {
            'pathPattern': '/signup/*'
        }
    },
    headers={
        'Authorization': 'Bearer your_api_key_here'
    }
)

data = response.json()
Request
$body = [
    'name' => 'Checkout Complete',
    'goalType' => 'path',
    'config' => [
        'pathPattern' => '/checkout/success'
    ]
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.rybbit.io/api/sites/1/goals');
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://app.rybbit.io/api/sites/1/goals')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer your_api_key_here'
request['Content-Type'] = 'application/json'
request.body = {
  name: 'Checkout Complete',
  goalType: 'path',
  config: { pathPattern: '/checkout/success' }
}.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 Complete",
    "goalType": "path",
    "config": map[string]string{
        "pathPattern": "/checkout/success",
    },
}
jsonBody, _ := json.Marshal(body)

req, _ := http.NewRequest("POST", "https://app.rybbit.io/api/sites/1/goals", 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 Complete",
    "goalType": "path",
    "config": {
        "pathPattern": "/checkout/success"
    }
});

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

let data: serde_json::Value = res.json().await?;
Request
String json = """
{
  "name": "Checkout Complete",
  "goalType": "path",
  "config": {
    "pathPattern": "/checkout/success"
  }
}
""";

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://app.rybbit.io/api/sites/1/goals"))
    .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 Complete",
    goalType = "path",
    config = new { pathPattern = "/checkout/success" }
};

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://app.rybbit.io/api/sites/1/goals", content);
var data = await response.Content.ReadAsStringAsync();
Response
{
  "success": true,
  "goalId": 3
}