curl --request POST \
--url https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"credential_id": "cred_NDc",
"run_name": "Nightly sync — Acme",
"records": [
{
"external_id": "1042",
"name": "Acme Corp"
}
],
"source_system": "acme-prod"
}
'import requests
url = "https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger"
payload = {
"credential_id": "cred_NDc",
"run_name": "Nightly sync — Acme",
"records": [
{
"external_id": "1042",
"name": "Acme Corp"
}
],
"source_system": "acme-prod"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
credential_id: 'cred_NDc',
run_name: 'Nightly sync — Acme',
records: [{external_id: '1042', name: 'Acme Corp'}],
source_system: 'acme-prod'
})
};
fetch('https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'credential_id' => 'cred_NDc',
'run_name' => 'Nightly sync — Acme',
'records' => [
[
'external_id' => '1042',
'name' => 'Acme Corp'
]
],
'source_system' => 'acme-prod'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger"
payload := strings.NewReader("{\n \"credential_id\": \"cred_NDc\",\n \"run_name\": \"Nightly sync — Acme\",\n \"records\": [\n {\n \"external_id\": \"1042\",\n \"name\": \"Acme Corp\"\n }\n ],\n \"source_system\": \"acme-prod\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"credential_id\": \"cred_NDc\",\n \"run_name\": \"Nightly sync — Acme\",\n \"records\": [\n {\n \"external_id\": \"1042\",\n \"name\": \"Acme Corp\"\n }\n ],\n \"source_system\": \"acme-prod\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"credential_id\": \"cred_NDc\",\n \"run_name\": \"Nightly sync — Acme\",\n \"records\": [\n {\n \"external_id\": \"1042\",\n \"name\": \"Acme Corp\"\n }\n ],\n \"source_system\": \"acme-prod\"\n}"
response = http.request(request)
puts response.read_body{
"id": "run_MQ",
"run_key": "550e8400-e29b-41d4-a716-446655440000",
"status": "queued"
}{
"error": {
"type": "authentication_error",
"message": "<string>",
"details": [
{
"message": "<string>",
"code": "<string>",
"field": "<string>"
}
]
}
}{
"error": {
"type": "authentication_error",
"message": "<string>",
"details": [
{
"message": "<string>",
"code": "<string>",
"field": "<string>"
}
]
}
}{
"error": {
"type": "authentication_error",
"message": "<string>",
"details": [
{
"message": "<string>",
"code": "<string>",
"field": "<string>"
}
]
}
}{
"error": {
"type": "authentication_error",
"message": "<string>",
"details": [
{
"message": "<string>",
"code": "<string>",
"field": "<string>"
}
]
}
}{
"error": {
"type": "authentication_error",
"message": "<string>",
"details": [
{
"message": "<string>",
"code": "<string>",
"field": "<string>"
}
]
}
}{
"error": {
"type": "authentication_error",
"message": "<string>",
"details": [
{
"message": "<string>",
"code": "<string>",
"field": "<string>"
}
]
}
}Trigger Blueprint
Queue an asynchronous Blueprint run against a vaulted credential.
curl --request POST \
--url https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"credential_id": "cred_NDc",
"run_name": "Nightly sync — Acme",
"records": [
{
"external_id": "1042",
"name": "Acme Corp"
}
],
"source_system": "acme-prod"
}
'import requests
url = "https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger"
payload = {
"credential_id": "cred_NDc",
"run_name": "Nightly sync — Acme",
"records": [
{
"external_id": "1042",
"name": "Acme Corp"
}
],
"source_system": "acme-prod"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
credential_id: 'cred_NDc',
run_name: 'Nightly sync — Acme',
records: [{external_id: '1042', name: 'Acme Corp'}],
source_system: 'acme-prod'
})
};
fetch('https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'credential_id' => 'cred_NDc',
'run_name' => 'Nightly sync — Acme',
'records' => [
[
'external_id' => '1042',
'name' => 'Acme Corp'
]
],
'source_system' => 'acme-prod'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger"
payload := strings.NewReader("{\n \"credential_id\": \"cred_NDc\",\n \"run_name\": \"Nightly sync — Acme\",\n \"records\": [\n {\n \"external_id\": \"1042\",\n \"name\": \"Acme Corp\"\n }\n ],\n \"source_system\": \"acme-prod\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"credential_id\": \"cred_NDc\",\n \"run_name\": \"Nightly sync — Acme\",\n \"records\": [\n {\n \"external_id\": \"1042\",\n \"name\": \"Acme Corp\"\n }\n ],\n \"source_system\": \"acme-prod\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.rubiehq.com/api/v1/blueprints/{blueprintKey}/trigger")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"credential_id\": \"cred_NDc\",\n \"run_name\": \"Nightly sync — Acme\",\n \"records\": [\n {\n \"external_id\": \"1042\",\n \"name\": \"Acme Corp\"\n }\n ],\n \"source_system\": \"acme-prod\"\n}"
response = http.request(request)
puts response.read_body{
"id": "run_MQ",
"run_key": "550e8400-e29b-41d4-a716-446655440000",
"status": "queued"
}{
"error": {
"type": "authentication_error",
"message": "<string>",
"details": [
{
"message": "<string>",
"code": "<string>",
"field": "<string>"
}
]
}
}{
"error": {
"type": "authentication_error",
"message": "<string>",
"details": [
{
"message": "<string>",
"code": "<string>",
"field": "<string>"
}
]
}
}{
"error": {
"type": "authentication_error",
"message": "<string>",
"details": [
{
"message": "<string>",
"code": "<string>",
"field": "<string>"
}
]
}
}{
"error": {
"type": "authentication_error",
"message": "<string>",
"details": [
{
"message": "<string>",
"code": "<string>",
"field": "<string>"
}
]
}
}{
"error": {
"type": "authentication_error",
"message": "<string>",
"details": [
{
"message": "<string>",
"code": "<string>",
"field": "<string>"
}
]
}
}{
"error": {
"type": "authentication_error",
"message": "<string>",
"details": [
{
"message": "<string>",
"code": "<string>",
"field": "<string>"
}
]
}
}202 immediately with an opaque run id. Poll
GET /blueprint-runs/{runId}/status
until a terminal state, then call
GET /blueprint-runs/{runId}/results
to retrieve completed outputs.
curl -s "$RUBIE_API_URL/api/v1/blueprints/$BLUEPRINT_KEY/trigger" \
-X POST \
-H "Authorization: Bearer $RUBIE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: sync-acme-2026-07-31" \
-d '{
"credential_id": "cred_...",
"run_name": "Nightly sync — Acme",
"records": [{ "external_id": "1042", "name": "Acme Corp" }],
"source_system": "acme-prod"
}'
Request body routing
Onlycredential_id and run_name are reserved. Every other top-level key is
matched by name against the Blueprint:
| Key matches… | What happens |
|---|---|
An INPUT node’s refKey | Value becomes that node’s input |
| A configured metadata item | Stored as run metadata (coerced to a string) |
| Neither | Ignored (including misspellings) |
application/json for structured payloads, or multipart/form-data when
an INPUT node expects a file. Routing rules are the same in both encodings.
Notes
blueprintKeycomes from Rubie / the dashboard — treat it as an opaque string.- Prefer a stable
Idempotency-Key(for example the id of the record in your system that triggered the run) so retries cannot start duplicates. - A Blueprint may require specific metadata items; omitting a required one
returns
400.
Authorizations
Your Rubie API key as a bearer token.
Headers
Unique key for safely retrying mutating requests. Matching key + body replays the original response for 24 hours. Matching key + different body returns 409 conflict.
Path Parameters
The Blueprint's trigger key, from the Rubie dashboard.
Body
Only credential_id and run_name are reserved. Every other top-level key is routed by name, against the Blueprint's own configuration:
-
If the key matches the
refKeyof an INPUT node, its value becomes that node's input payload. Objects and arrays are sent as JSON; strings are passed through as-is. -
If the key matches a metadata item configured on the Blueprint, it is stored as run metadata (coerced to a string) and shown on the run in the Rubie dashboard. Use these for correlation ids from your own system.
-
If the key matches neither, it is ignored.
A Blueprint may mark a metadata item as required, in which case omitting it returns 400. Ask your Rubie contact for the Blueprint's input refKeys and metadata items, or read them off the Blueprint canvas.