Beeline (platform)

Beeline is a vendor-neutral VMS commonly chosen for best-of-breed contingent workforce programmes, and the first destination composerID is integrating. Its developer portal publishes machine-readable OpenAPI specifications for a current generation of Client APIs: worker management (request, intake form, candidate, assignment, worker), business intake, project agreement (SOW) reads and approvals, supplier, invoice, time-and-expense, attachment, program and foundational data. Alongside them sit a Webhook Management API and Reporting-as-a-Service for programme-scale reads. The request objects carry a client-supplied externalId, filterable on reads, which is where the Intent ID travels. Beeline's own integration scenarios include exactly composerID's pattern: an intake started in an external system, automated into Beeline, and completed there.

Publish path
Direct API
composerID adapter → Beeline API
Events back
Push events
native webhooks / events back
API access
Open docs
public developer portal
Contract tier
Tier A
full loop: publish + events back
Tenant configuration (mandatory fields, approval chains, picklists) is a separate gate from vendor capability: it is discovered at preflight before first publish and may need destination admin changes. How composerID connects →
Shape of the integration
How the Beeline integration runs

One decision, one publish, one identifier that survives the whole round trip. Everything drawn here is an endpoint or event in Beeline’s published specifications.

BEELINE TENANT · client.beeline.com/apiTriage decidesIntent Recordand Intent IDcomposerID publishespreflight, then POSTbusiness-intake-requestsBusiness intakerequest createdexternalId = Intent IDBeeline Requestthe MSP convertsthe intakeEngagement runsassignment, SOW,timesheet, invoicePLANPUBLISHMSPRUNSitn_7f3aIntent timelineevery event and driftunder one Intent IDcomposerID reconcilesreads back, compares,flags driftwebhooks, event history, RaaS reads
BEELINE TENANTclient.beeline.com/apiTriage decidesIntent Record and Intent IDcomposerID publishespreflight, then POST business-intake-requestsBusiness intake requestexternalId = Intent ID, filterable on readsBeeline Requestthe MSP converts the intakeEngagement runsassignment, SOW, timesheet, invoicecomposerID reconcileswebhooks, event history, RaaS readsIntent timelineevery event and drift under one Intent IDitn_7f3aMSP CONVERTSRUNSevents and readsAPPENDS

The dark line is the Intent ID: minted at the decision, carried into Beeline as the request's externalId, and used to re-find the record on every read. The dashed step inside the tenant is the MSP's, not ours. The accent return path is how the engagement reports back: real-time webhooks, the event-history endpoint when a push is missed, and RaaS reports for a whole programme at once.

Reference
API at a glance

The public API facts composerID's adapter relies on. Tenant-specific details (custom fields, picklists, approval chains) are confirmed during connection and folded into the MappingProfile.

Developer access

The Beeline API details are for registered developers

Auth model, base URLs, event posture and rate limits, free with a developer account.

Get free access → Registered developers are recognised automatically.
Readiness
Docs confidence: Public

“Docs confidence” describes how deterministic our mapping templates can be before we connect to a tenant. Even with public docs, implementations vary, especially around custom fields, approval flows and object extensions.

Deterministic mapping

Common Workforce Model fields map to known API fields. Best for standard objects (requisitions, assignments, timesheets, POs).

Tenant discovery

composerID can scan tenant configuration (custom fields, picklists, required fields) where the platform permits it, then generate a tenant‑specific MappingProfile.

Enrichment loop

If the target platform requires a field the Intent record doesn't yet have, composerID emits an enrichment_request back to the intake layer.

Mapping
Minimum viable mapping for Beeline

An opinionated baseline. The platform adapter enforces additional requirements via preflight. “Tenant required” fields are discovered during connection and added to the MappingProfile.

Developer access

The field-level mapping is for registered developers

Object targets, canonical fields and the Intent ID carrier for Beeline, free with a developer account.

Get free access → Registered developers are recognised automatically.
Idempotency & drift: publish + reconcileExpand

Publish operations are idempotent using a deterministic key {intent_id}-{intent_version}-{target_system}. Because humans can change records inside the platform, composerID supports reconciliation: it compares the platform record snapshot to the canonical intent and flags drift.

Working with Beeline
Deep links & scenarios

Where composerID posts data into Beeline, where it reads data back, and where a person lands when they follow a link. Grounded in the scenarios on Beeline’s own developer portal; exact record URLs are confirmed per tenant at onboarding.

Open a job (contingent request)

composerID → Beeline

Triage classifies the request as contingent; composerID publishes it through the Business Intake API with the Intent ID in the request's externalId, a stock field that is filterable on reads, so the record is re-findable without storing Beeline internals. The intake appears in Beeline ready for the MSP to progress; the receipt links to the intake record, and the request link attaches when the MSP converts it.

APIs: business-intake_2025-01-01 · client-defined-values (optional visible field)

Deep link: {tenant_host}/intakes/{intake_id} (illustrative)

Partially complete a form

round trip

Beeline's own Request Intake scenario: an intake starts in an external system and is automated into Beeline, where the MSP reviews the form and creates the corresponding Request. The Intake Form API takes exactly one required field: a client-supplied trackingNumber, which carries the Intent ID. Everything else is free-text pre-fill for what Triage captured, and the deep link lands the MSP or manager on the form to finish the tenant-only fields. Nothing is retyped, and the form is queryable by tracking number.

APIs: worker-management_2023-07-01 (#tag/Request, intake-process/request-forms) · program-data + foundational (valid picklist values)

Deep link: {tenant_host}/intakes/{intake_id} (illustrative)

Open a bid / track supplier responses

Beeline → composerID

Once the request is live, bid and candidate-submission events arrive through the Webhook Management API. A candidate submission with its resume lands on the intent timeline as it happens, and the deep link opens the request's candidate list in Beeline.

APIs: webhook-management_2023-07-01 (bid.submitted, candidate.submitted) · worker-management (#tag/Candidate)

Deep link: {tenant_host}/requests/{request_id}/candidates (illustrative)

Follow an SoW (services channel)

Beeline → composerID

Statements of Work are created inside Beeline. Its API exposes no SOW create endpoint, and this page does not pretend otherwise. What the API does give the intent timeline: approval-stage webhooks as the SOW moves through its lifecycle, real-time reads of the SOW, its milestones and payments for reconciliation, and approve/reject calls on SOWs and milestone payments from wherever the approver works.

APIs: sow_2025-01-01 (Project Agreement Management: reads + approvals) · webhook-management (SOW events)

Deep link: {tenant_host}/sows/{sow_id} (illustrative)

Approve time and spend where it happens

Beeline → composerID

A timesheet submitted in Beeline raises a webhook; composerID retrieves the timesheet and financial detail so spend appears against the Intent ID, and can approve or reject it. Project milestone payments follow the same pattern: a pending event, a read, and an approve/reject call from wherever the approver works.

APIs: bte_2023-07-01 (#tag/Timesheet: read + approve/reject) · sow_2025-01-01 (milestone payments) · webhook-management (timesheet.submittedforapproval)

Programme-scale reconciliation

Beeline → composerID

Any Report Builder report becomes a JSON endpoint through Reporting-as-a-Service, one report per call, so composerID sweeps a programme for drift with a report keyed on externalId instead of polling record by record. Attachments come back as binary through the Attachment API when the evidence pack needs the source documents.

APIs: RaaS (supplemental-data_2025-09-01, scope run:raas) · attachment_2025-01-01

Assurance
What crosses the boundary

Triage decides and keeps the evidence; Beeline receives a valid request and the identifier that ties it back. This is the complete outbound payload of a contingent publish, taken from the create schema of business-intake_2025-01-01.

Beeline field What it carries Where the value comes from
jobTitleIdThe job title being requested, as a Beeline UUIDResolved from the site's own job-title list (program-data)
hiringManagerIdThe requesting manager's Beeline user. The only person identifier sentResolved from the site's user list (foundational)
workLocationIdWhere the work happens, as a Beeline UUIDResolved from the site's work locations (foundational)
quantityHow many positionsThe Triage decision
startDate, endDate or durationWhen the engagement starts and endsThe Triage decision
billToCostCenterId, adminCostCenterId, timesheetApproverIdCost coding and timesheet approver, where the site requires themResolved from the site's own lists
requestName, commentsA request title and a one-line provenance note. No diagnostic contentComposed by composerID
externalIdThe Intent ID, so the record can be re-found and reconciledcomposerID
clientDefinedValuesOnly the fields a programme explicitly maps, such as a Source fieldAgreed at onboarding

What comes back

  • Webhook events as references: the event id, type, time and the Beeline record ids needed for a deep link.
  • Request and intake status, so the timeline shows where the request has reached.
  • Assignment dates, rate and status, compared against the Intent Record to detect drift.
  • SOW approval state, milestones and payments for the services channel.
  • Timesheet and financial detail, so spend appears against the Intent ID.
  • Programme-wide reads through a RaaS report keyed on externalId, instead of polling record by record.

What is never sent

  • The diagnostic conversation: questions asked, answers given, scores, rankings or override events.
  • The Compliance File, or any link that would expose it without authentication.
  • Candidate or worker personal data. composerID collects none, and resumes stay in Beeline unless a programme puts them in scope.
  • Rates, budgets or commercial terms beyond what the programme's mapping explicitly includes.
  • Credentials, tokens or signing material belonging to any other system.
Assurance
Access we ask for, and what “proven” will mean

Beeline grants scopes per API product, so least privilege is checkable rather than promised. This is the full grant we ask for, and the grant we do not.

API product Scopes requested Why
Business Intake (business-intake_2025-01-01)read:business_intake, write:business_intake, read:client_defined, write:client_definedPublish the request and carry the Intent ID
Worker Management (worker-management_2023-07-01)read:request, read:intake-form, write:intake-form, read:candidate, read:assignmentThe intake-form path, and read-back for reconciliation
Webhook Management (webhook-management_2023-07-01)read:webhook_management, write:webhook_managementSubscribe, validate the endpoint, recover missed events
Project Agreement Management (sow_2025-01-01)read:sow, read:projectSOW and milestone read-back. No writes needed
Financial Time & Expense (bte_2023-07-01)read:bteTimesheet and spend read-back
Supplemental Data (RaaS)run:raasProgramme-scale reconciliation reads

Not requested

No Foundational Data writes (write:iam, write:org, write:user, write:spend_authority), no supplier or invoice scopes, and no approval-write scopes. Approving time or candidates from a chat surface needs write:bte or write:candidate, which stays a separate and explicit grant rather than something bundled into the publish integration.

Sandbox exit criteria

  1. Publish a contingent request end to end with the Intent ID in externalId, re-find it by the list filter, and replay a duplicate publish without creating a second record.
  2. Create a webhook subscription, prove endpoint ownership with the validate handshake, verify delivery authenticity with the agreed method, and recover a deliberately missed event from event history.
  3. Show preflight reading the site's own required fields and picklists, and rejecting an incomplete publish before it reaches Beeline.
  4. Produce a field-level mapping document for the site. Only then does the public coverage status move beyond what the specifications alone support.
Tenant specifics
Custom fields & unique mapping

Real deployments rely on program-specific custom fields (for compliance, approvals, GL coding, rate rules or supplier constraints). composerID is designed to generate tenant‑specific mappings rather than forcing you to redesign your intake.

How scanning works

High-level flow

connect_destination() → read required fields + picklists (where permitted) → detect custom fields / extensions → build MappingProfile + validation rules → preflight intent against tenant requirements

What gets produced

Portable artefacts

MappingProfile (tenant-scoped) Capabilities matrix Required-field rules Picklist dictionaries Enrichment prompts Audit spine links (defence_file_ref)
Developer access

Tenant-mapping notes are for registered developers

Where Beeline deployments differ tenant to tenant, and what to check before first publish.

Get free access → Registered developers are recognised automatically.
Next
Implement the adapter

Use this page alongside the API + Schemas docs to implement: destination connection, preflight validation, publish, webhook back-sync and reconciliation.