First-party app
Streamtime

Streamtime

Read and write Streamtime jobs, job items, quotes, invoices, logged time and expenses, and run filtered searches and reports against the Public API.

stable Project ManagementFinance & AccountingProductivity

About

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.

App id
io.w6w.streamtime
Version
0.1.0
Author
w6w
Licence
MIT
Categories
Project Management · Finance & Accounting · Productivity

Overview

Streamtime 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.

Build with Streamtime

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.

Get Branch

branch-get

Fetch one branch by id.

List Branches

branches-list

List all branches of the organisation. Unpaginated — the response is the whole set.

List Company Addresses

company-addresses-list

List the addresses recorded against a company.

Create Company Contact

company-contact-create

Create a contact against a company.

List Company Contacts

company-contacts-list

List the contacts belonging to a company.

Create Company

company-create

Create a company in the authenticated organisation.

Get Company

company-get

Fetch one company by id.

Update Company

company-update

Update a company's name, status, tax number, phones or website.

Get Contact

contact-get

Fetch one contact by id, if it belongs to your organisation.

Update Contact

contact-update

Update a contact's details and status.

Get Invoice

invoice-get

Fetch one invoice by id — status, dates, totals and balance.

Get Invoice HTML

invoice-html-get

Fetch an invoice as generated HTML.

List Invoice Line Items

invoice-line-items-list

List the line items on an invoice.

Create Invoice Payment

invoice-payment-create

Record a payment or payout against an invoice, optionally routed through a payment account.

List Invoice Payments

invoice-payments-list

List the payments and payouts recorded against an invoice.

Get Invoice PDF

invoice-pdf-get

Download an invoice's PDF, base64-encoded.

List Invoice Tracked Line Items

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.

Update Invoice

invoice-update

Update an invoice's name, number, reference, type or status. A status change may issue the invoice.

List Job Activity Entries

job-activity-entries-list

List the active activity entries (comments and system events) on a job, optionally filtered by activity entry type.

Create Job Comment

job-activity-entry-create

Add a comment to a job's activity feed.

Create Job

job-create

Create a job for a company. Returns the new job, including its id.

Duplicate Job

job-duplicate

Duplicate a job. Streamtime does not document the options object, so any options are passed through exactly as given.

Get Job

job-get

Fetch one job by id — status, company, lead, rates and its planned, logged and invoiced totals in the job's currency.

Create Job Item

job-item-create

Create a job item on a job, optionally in a phase, with its status, rates and planned time.

List Job Item Dependencies

job-item-dependencies-list

List the dependencies between a job's items. Read-only — the API cannot create one.

Get Job Item

job-item-get

Fetch one job item by id — phase, status, rates, planned/incomplete/logged minutes and its sub-item counts.

Create Job Item Role

job-item-role-create

Assign a role to a job item with its own sell rate and planned minutes.

Get Job Item Role

job-item-role-get

Fetch one job item role assignment by id.

Update Job Item Role

job-item-role-update

Change a job item role's role, sell rate or planned minutes.

List Job Item Roles

job-item-roles-list

List the role assignments on a job item.

Create Job Item Sub-item

job-item-sub-item-create

Add a sub-item to a job item.

Get Job Item Sub-item

job-item-sub-item-get

Fetch one job item sub-item by id.

Update Job Item Sub-item

job-item-sub-item-update

Update a sub-item's description, status or order.

List Job Item Sub-items

job-item-sub-items-list

List the sub-items of a job item.

Update Job Item

job-item-update

Update a job item's phase, status, description, rates, planned time or dates.

Create Job Item User

job-item-user-create

Schedule a user on a job item. Planned minutes only apply when the item allocates time by person.

Delete Job Item User

job-item-user-delete

Remove a user from a job item's schedule.

Get Job Item User

job-item-user-get

Fetch one job item user (schedule entry) by id.

Update Job Item User

job-item-user-update

Change a schedule entry's status, sell rate or planned minutes.

List Job Item Users

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.

List Job Items

job-items-list

List a job's active job items.

Create Job Milestone

job-milestone-create

Create a milestone on a job.

Delete Job Milestone

job-milestone-delete

Delete a job milestone.

Get Job Milestone

job-milestone-get

Fetch one job milestone by id.

Update Job Milestone

job-milestone-update

Update a milestone's name or date.

List Job Milestones

job-milestones-list

List a job's milestones.

Create Job Phase

job-phase-create

Create a phase on a job.

Delete Job Phase

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.

Get Job Phase

job-phase-get

Fetch one job phase by id.

Update Job Phase

job-phase-update

Rename a job phase. `orderId` is read-only and cannot be set here.

List Job Phases

job-phases-list

List a job's phases in order.

Update Job Status

job-status-update

Set a job's status. Streamtime may reject this for active/archived plan limits even when the job itself is valid.

Update Job

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.

Create Label

label-create

Attach a label to an entity, optionally creating the master label too.

Delete Label

label-delete

Delete a label by id.

List Labels

labels-list

List the master labels for a label type, or the labels attached to one entity when an entity id is given.

Search Labels

labels-search

Fetch labels for many entities at once, given a mapping of entity class names to ids.

Create Logged Expense

logged-expense-create

Log an expense against a job and phase, with its supplier, pricing method, cost and sell rates.

Get Logged Expense

logged-expense-get

Fetch one logged expense by id.

Get Logged Expense Purchase Order

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.

List Purchase Order Line Items

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.

Update Logged Expense

logged-expense-update

Update a logged expense — status, dates, supplier, pricing method, rates or markup.

Create Logged Time

logged-time-create

Log a single time entry against a job or a job-item user, with its date, minutes and notes.

Delete Logged Time

logged-time-delete

Delete a logged time entry.

Get Logged Time

logged-time-get

Fetch one logged time entry by id.

Update Logged Time

logged-time-update

Update a time entry's minutes, date, status, notes or attachments.

Create Logged Times (Bulk)

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.

Get Organisation

organisation-get

Fetch the organisation this connection's bearer token belongs to — its name, domain, default currency and address.

Get Quote

quote-get

Fetch one quote by id — status, totals, currency and dates.

Get Quote HTML

quote-html-get

Fetch a quote as generated HTML.

List Quote Line Items

quote-line-items-list

List the line items on a quote.

Get Quote PDF

quote-pdf-get

Download a quote's PDF, base64-encoded.

List Quote Tracked Line Items

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.

Get Rate Card

rate-card-get

Fetch one rate card by id.

List Rate Cards

rate-cards-list

List all rate cards for the organisation. Unpaginated.

Run Report

report-run

Run an aggregate report — totals, averages and grouped breakdowns over jobs, time, expenses, quotes, invoices, job groups, companies, contacts or users.

Get Report Setup

report-setup-get

Fetch the grouping options, statistics columns and filters available for one report view.

Get Role

role-get

Fetch one role by id.

List Roles

roles-list

List the organisation's roles. Archived roles are excluded unless asked for.

Search Records

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.

Get Search Setup

search-setup-get

Fetch the filters, additional data and sort columns available for one search view. Streamtime advises fetching this once and reusing it.

Get User

user-get

Fetch one user by id — display name, email, branch, role, status, default rates and the hours they normally work each day.

List User Saved Segments

user-saved-segments-list

List the saved search segments visible to one user, optionally filtered by segment type.

List Users

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>"
      }
    }
  ]
}

Here are some of the things you can do

  • Get Branch

    read
    branch-get
  • List Branches

    search
    branches-list
  • List Company Addresses

    search
    company-addresses-list
  • Create Company Contact

    perform
    company-contact-create
  • List Company Contacts

    search
    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.

Install
npm install @w6w/sdk
yarn add @w6w/sdk
pnpm add @w6w/sdk
deno add npm:@w6w/sdk
Code
import { 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);
Install the CLI
npm install -g @w6w/cli
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.

What the agent gets

Credentials it can't read

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.

A tool surface scoped to the caller

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.

A durable workflow in one call

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.

Health-aware discovery

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).

Request MCP access

Health checks

Streamtime declares its own checks, so its health is a property of the app rather than something the host guesses at.

service

Streamtime platform status

The `API` component of streamtime.statuspage.io, with the page's other components (Frontend, Streamtime.net, MCP API) reported alongside it.

credential

Bearer token accepted

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.

quota

Quota headroom

Declared unavailable: Streamtime's API document describes no quota or usage endpoint, and no response carries a rate-limit or retry header.