Get the task brief
/v1/integrate takes the endpoints you picked plus the job you're doing, and returns a task brief assembled from those endpoints' schemas, shared variables, and auth settings. It's the document you'd otherwise have reconstructed by hand from four doc pages.
- In the Orbit collection, add a second request named Get task brief, method POST, URL:
https://api.buildwithorbit.ai/v1/integrate- Open the Body tab, select raw → JSON, and paste the payload below. Note the
id: it's{{endpointUrn}}, not a pasted value. Postman substitutes your collection variable when the request is sent, so there's nothing to retype and nothing to get out of sync.
{
"task": "When a Deskly user books a desk, create a calendar event for that time slot",
"resources": [
{
"id": "{{endpointUrn}}",
"type": "endpoint"
}
]
}- Open the Scripts tab, select After response, and paste the visualizer below. The brief lands in
data[0].taskBriefas one long plain-text string — hard to scan in Body. This script splits it into sections and renders them in the Visualization tab.
// Visualization Script
const response = pm.response.json();
const taskBrief = response.data[0].taskBrief;
// Split into sections by double newline
const sections = taskBrief.split('\n\n');
// Helper: render lines within a section body
function renderLines(lines) {
let html = '';
let inList = false;
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
const trimmed = line.trim();
// Numbered step: starts with digit and dot/period
const isNumbered = /^\d+\./.test(trimmed);
// Dash bullet
const isDash = /^-\s/.test(trimmed);
// Sub-bullet (indented dash)
const isSubBullet = /^\s{2,}-\s/.test(line);
if (isNumbered || isDash || isSubBullet) {
if (!inList) {
html += '<ul style="margin:6px 0 6px 0;padding-left:20px;list-style:none;">';
inList = true;
}
const bullet = isNumbered ? '►' : (isSubBullet ? '–' : '•');
const content = trimmed.replace(/^[\d]+\.\s*/, '').replace(/^-\s*/, '');
const indent = isSubBullet ? 'margin-left:16px;' : '';
html += `<li style="margin:3px 0;${indent}"><span style="color:#555;margin-right:6px;">${bullet}</span>${escapeHtml(content)}</li>`;
} else {
if (inList) {
html += '</ul>';
inList = false;
}
if (trimmed !== '') {
// Check if it looks like a param label (e.g. "Params:", "Returns:", "Threading:")
if (/^[A-Za-z ]+:$/.test(trimmed)) {
html += `<p style="margin:6px 0 2px 0;font-weight:600;color:#444;">${escapeHtml(trimmed)}</p>`;
} else {
html += `<p style="margin:4px 0;line-height:1.6;">${escapeHtml(trimmed)}</p>`;
}
}
}
}
if (inList) html += '</ul>';
return html;
}
function escapeHtml(str) {
return str
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/`([^`]+)`/g, '<code style="background:#f0f0f0;padding:1px 4px;border-radius:3px;font-family:monospace;font-size:0.9em;">$1</code>');
}
// Build section HTML
function renderSection(section, index) {
const lines = section.split('\n');
const heading = lines[0].trim();
const bodyLines = lines.slice(1);
const isTitle = index === 0;
const headingStyle = isTitle
? 'font-size:1.4em;font-weight:700;color:#1a1a2e;margin:0 0 4px 0;letter-spacing:0.5px;'
: 'font-size:1.05em;font-weight:700;color:#2563eb;margin:0 0 8px 0;text-transform:uppercase;letter-spacing:1px;border-bottom:2px solid #dbeafe;padding-bottom:4px;';
const bodyHtml = renderLines(bodyLines.filter(l => l.trim() !== '' || bodyLines.indexOf(l) > 0));
const cardStyle = isTitle
? 'background:#1a1a2e;color:#e0e7ff;padding:20px 24px;border-radius:10px 10px 0 0;margin-bottom:0;'
: 'background:#ffffff;padding:16px 24px;border-radius:6px;margin-bottom:12px;box-shadow:0 1px 3px rgba(0,0,0,0.08);border-left:4px solid #2563eb;';
const headingColor = isTitle ? 'color:#e0e7ff;' : '';
return `<div style="${cardStyle}">
<h2 style="${headingStyle}${headingColor}">${escapeHtml(heading)}</h2>
<div style="font-size:0.95em;color:${isTitle ? '#c7d2fe' : '#374151'};line-height:1.7;">${bodyHtml}</div>
</div>`;
}
const template = `
<html>
<head>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: #f1f5f9;
margin: 0;
padding: 20px;
color: #1f2937;
}
.container {
max-width: 820px;
margin: 0 auto;
}
code {
background: #f0f0f0;
padding: 1px 4px;
border-radius: 3px;
font-family: monospace;
font-size: 0.9em;
}
</style>
</head>
<body>
<div class="container">
{{#each sections}}
{{{html}}}
{{/each}}
</div>
</body>
</html>`;
function createPayload() {
return {
sections: sections.map((s, i) => ({ html: renderSection(s, i) }))
};
}
pm.visualizer.set(template, createPayload());- Save, then click Send. Expect a
200withdata[0].taskBrief. Orbit assembles the brief on demand rather than serving a cached page, so it can take a few seconds. - In the response pane, open the Visualization tab (next to Body). You should see the brief laid out in sections — FIT (whether these endpoints actually suit the task), AUTH (including which credentials you'd have to obtain), BASE URL, STEPS with parameters and expected responses, dependencies between steps, and important considerations.
Note what just happened: you now know what integrating this endpoint would cost you (which account, which credential, which request order), and you never left Postman or signed up for anything.
Troubleshooting: A 404 means endpointUrn doesn't hold a valid id. Open the collection's Variables tab and check it against your search response, in full and unedited. resources accepts 1 to 10 entries, so you can brief Orbit on several endpoints at once. The brief will cover how they chain together. If Visualization is empty, confirm the script is on Scripts → After response (not Before request), that you saved before sending, and that the response includes data[0].taskBrief.