Read and write Streamtime jobs, job items, quotes, invoices, logged time and expenses, and run filtered searches and reports against the Public API.
Streamtime ships in the w6w first-party pack. It declares 84 actions, 3 health checks, and the host runs its code in a sandbox that never sees the credential.
io.w6w.streamtimeStreamtime is job tracking and project management for creative agencies: the money side of a studio — jobs, phases, job items, the people and roles booked against them, quotes, invoices, and the time and expenses everybody logs — lives in one place.
The Public API is shaped unlike a typical REST surface, and this app is built around what it actually does. Only four of the resource collections answer a list request at all (branches, rate cards, roles, users); companies, jobs, logged time and logged expenses are create-only at the collection level and readable one id at a time. Getting a list of them means going through POST /search, a generic query endpoint with its own filter-expression language, which this app exposes verbatim — along with GET /search/setup and GET /report/setup, the two metadata endpoints Streamtime tells callers to fetch first. POST /report covers the aggregation questions the same way: totals, averages and grouped breakdowns without pulling every record back.
Beyond search, the app covers the full documented write surface — creating and updating companies, contacts, jobs, phases, job items, milestones, item roles, item users and sub-items, logging time in bulk, logging and updating expenses, creating invoice payments, and managing labels — plus the nesting underneath a job item, which is where agency scheduling actually lives. Quote and invoice documents come back as HTML or base64-encoded PDF.
Health checks track Streamtime’s own status page (its API component), probe the credential with the organisation read, and record that Streamtime publishes no quota or rate-limit surface at all. The credential probe deliberately classifies from the response body rather than the status code, because Streamtime answers an identical 401 body for a missing token, an invalid token, and a path that does not exist.
Three routes to the same 84 actions. The Workflow tab is generated from Streamtime's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.
branches-list List all branches of the organisation. Unpaginated — the response is the whole set.
invoice-payment-create Record a payment or payout against an invoice, optionally routed through a payment account.
invoice-payments-list List the payments and payouts recorded against an invoice.
invoice-tracked-line-items-list Fetch the tracked line items relating to an invoice. Streamtime documents the body only as an object grouped by type, so it is returned unchanged.
invoice-update Update an invoice's name, number, reference, type or status. A status change may issue the invoice.
job-activity-entries-list List the active activity entries (comments and system events) on a job, optionally filtered by activity entry type.
job-duplicate Duplicate a job. Streamtime does not document the options object, so any options are passed through exactly as given.
job-get Fetch one job by id — status, company, lead, rates and its planned, logged and invoiced totals in the job's currency.
job-item-create Create a job item on a job, optionally in a phase, with its status, rates and planned time.
job-item-dependencies-list List the dependencies between a job's items. Read-only — the API cannot create one.
job-item-get Fetch one job item by id — phase, status, rates, planned/incomplete/logged minutes and its sub-item counts.
job-item-role-create Assign a role to a job item with its own sell rate and planned minutes.
job-item-role-update Change a job item role's role, sell rate or planned minutes.
job-item-update Update a job item's phase, status, description, rates, planned time or dates.
job-item-user-create Schedule a user on a job item. Planned minutes only apply when the item allocates time by person.
job-item-user-update Change a schedule entry's status, sell rate or planned minutes.
job-item-users-list List the people scheduled on a job item, with their planned/incomplete/logged minutes. Per-person planned minutes read 0 when the item pools its time at item level.
job-phase-delete Delete a phase. Its job items and logged expenses move to another phase, stay on the job with no phase, or are deleted — pick one.
job-phase-update Rename a job phase. `orderId` is read-only and cannot be set here.
job-status-update Set a job's status. Streamtime may reject this for active/archived plan limits even when the job itself is valid.
job-update Update a job's name, number, status, lead, contact, rate card or branch. Financial fields are read-only; use Update Job Status for a status transition.
labels-list List the master labels for a label type, or the labels attached to one entity when an entity id is given.
labels-search Fetch labels for many entities at once, given a mapping of entity class names to ids.
logged-expense-create Log an expense against a job and phase, with its supplier, pricing method, cost and sell rates.
logged-expense-purchase-order-get Fetch the purchase order for a logged expense. Returns null when the expense is not a purchase order — that is a successful answer, not an error.
logged-expense-purchase-order-line-items-list List the line items of a logged expense's purchase order. An empty list means the expense is not a purchase order.
logged-expense-update Update a logged expense — status, dates, supplier, pricing method, rates or markup.
logged-time-create Log a single time entry against a job or a job-item user, with its date, minutes and notes.
logged-time-update Update a time entry's minutes, date, status, notes or attachments.
logged-times-create-bulk Log up to a batch of time entries in one request. Each entry needs at least a date and minutes, and belongs to a job or a job-item user.
organisation-get Fetch the organisation this connection's bearer token belongs to — its name, domain, default currency and address.
quote-tracked-line-items-list Fetch the tracked line items relating to a quote. Streamtime documents the body only as an object grouped by type, so it is returned unchanged.
report-run Run an aggregate report — totals, averages and grouped breakdowns over jobs, time, expenses, quotes, invoices, job groups, companies, contacts or users.
report-setup-get Fetch the grouping options, statistics columns and filters available for one report view.
search-records Run a filtered search over one of Streamtime's 24 search views. The only way to list jobs, companies, contacts, quotes, invoices, logged time, logged expenses and users.
search-setup-get Fetch the filters, additional data and sort columns available for one search view. Streamtime advises fetching this once and reusing it.
user-get Fetch one user by id — display name, email, branch, role, status, default rates and the hours they normally work each day.
user-saved-segments-list List the saved search segments visible to one user, optionally filtered by segment type.
users-list List every user in the organisation, with their branch, role, status and default rates. Unpaginated.
A workflow step names the app and the action, and the editor fills in the
connection when you pick one. This is the Step shape from the
workflow spec, carrying Streamtime's real ids.
{
"manifestVersion": "2",
"name": "streamtime-example",
"steps": [
{
"id": "branch-get",
"uses": {
"app": "io.w6w.streamtime",
"action": "branch-get",
"connection": "conn_YOUR_CONNECTION_ID"
},
"with": {
"branchId": "<branchId>"
}
}
]
}branch-get branches-list company-addresses-list company-contact-create company-contacts-list +79 more actions available
Every app-specific value here is a blank you have to fill in. An
app action is reached through the connection that authenticates it, so the
address is a connection id, not the app id — and connections belong to your account,
so a public page cannot know yours. Create one for Streamtime, then fill in
the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the
parameters that action declares. The call itself is real — the shape is transcribed
from the studio's own snippet builder, which prints the same kind of blanks — but
nothing in it is specific to Streamtime. The Workflow tab is where this app's
real ids are.
npm install @w6w/sdkyarn add @w6w/sdkpnpm add @w6w/sdkdeno add npm:@w6w/sdkimport { W6wClient, isActionRun } from "@w6w/sdk";
// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();
const envelope = await client.run({
urn: "conn_YOUR_CONNECTION_ID",
action: "branch-get",
payload: {
branchId: "<value>",
},
});
if (isActionRun(envelope)) console.log(envelope.value); npm install -g @w6w/cli w6w run conn_YOUR_CONNECTION_ID --action branch-get --payload '{"branchId":"<value>"}' Give an AI agent Streamtime — without giving it Streamtime's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.
One tool call{
"name": "w6w_invoke",
"arguments": {
"ref": "app:io.w6w.streamtime#branch-get",
"input": {
"branchId": "<branchId>"
}
}
}
Every tool names its target with a single ref. The
app: form above doesn't name a connection at all — the
host resolves which of the caller's Streamtime connections to sign
with, and refuses rather than guesses when the answer is ambiguous.
The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.
Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.
Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.
Streamtime's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.
The MCP surface is part of the hosted platform. Streamtime itself is MIT, and the runtime that executes it is source-available (FSL).
Streamtime declares its own checks, so its health is a property of the app rather than something the host guesses at.
The `API` component of streamtime.statuspage.io, with the page's other components (Frontend, Streamtime.net, MCP API) reported alongside it.
Reads GET /organisation with this connection's token. Streamtime returns the same 401 body for a missing token, a revoked token and an unknown path, so the check classifies from that body rather than from the status code.
Declared unavailable: Streamtime's API document describes no quota or usage endpoint, and no response carries a rate-limit or retry header.