bitlync Docs

Concepts

Writes

dry_run defaults to false, so a write is real. Test writes in the sandbox. Optional: dry_run true checks a write against a new MSP's setup without creating a record. After Bitlync creates a ticket, you can update it, append a note, close with evidence, or POST hours on that ticket. You can close a ticket once they accept the connection. Auto-close when a finding is fixed is a separate switch. Hours take stated billable and a required member. Pick the member id from GET /tenants/{tenant_id}/members. Halo and ConnectWise return that list when the member permission is on. A missing ConnectWise members permission returns 502 upstream_auth_failure.

Reads include vendor: { connector, native_id, native }. native is the same payload as .raw. Ticket writes accept optional vendor_native on POST /tenants/{tenant_id}/tickets and POST /tenants/{tenant_id}/tickets/write. POST /tenants/{tenant_id}/companies/write writes a Halo or ConnectWise company custom-field value on an existing company via vendor_native, and ensure_custom_field creates the missing field definition. The field works live on Halo and ConnectWise. It is created once in your stack under the MSP's standing psa.company.field.create grant, and an existing field with the same label is reused. The field label shows on Configure. Value writes use the psa.company.update grant, off by default. A missing grant is grant_missing. If the update does not run, the code is psa_company_update_refused.

Mechanism

Preview first. Then commit with the same body and an idempotency_key on writes that support it. If a fan-out is only partial, that failure is explicit on the response.

What the caller sees

A dry run does not create a ticket. A commit does. Partial failure is visible on the response, not hidden.

write, or check first
{
  "summary": "Printer offline",
  "idempotency_key": "ticket-1"
}

// optional check, no record created
{
  "summary": "Printer offline",
  "dry_run": true,
  "idempotency_key": "ticket-check-1"
}

POST /tenants/{tenant_id}/tickets with dry_run false creates, updates, closes, reopens, notes, and posts time. Halo and ConnectWise. Writes are real by default. SuperOps tickets are list, read, and write. SuperOps does not offer time entries, members, or the board, status, and priority lists.

Closing is the MSP's call. On Configure, under Ticketing, the MSP turns on "Allow closing tickets with a resolution" for that connection; it is off by default. On, a close_with_resolution write closes the ticket in your stack with the resolution note. Off, the resolution lands as a note and the ticket stays open.

GET /tenants/{tenant_id}/agreements returns agreements for Halo, ConnectWise, and SuperOps, and billing line items for Halo and ConnectWise. SuperOps agreements are read only: no agreement-line writes and no draft contracts. The MSP matches each service to an existing billing line. You send an absolute quantity with POST /tenants/{tenant_id}/billing/quantities. Quantity 0 stops billing. A write happens when you send it, on the cadence you set for that service (daily or monthly). The MSP's change limit defaults to 25%. A change over that limit, or Advanced review, comes back waiting and is not written until the MSP reviews it. Ending a line is refused: action end returns 422 agreement_line_action_not_allowed. Bitlync never creates agreements or billing lines. Request and response examples are on What we write. Billing services start from a price-list import or a hand entry, and imported rows are reviewed before they publish. Alert setup and routing are on Alerts.

GET the project, then POST on that project. ConnectWise and Halo.

ConnectWise and Halo: GET /tenants/{tenant_id}/ticket-boards, ticket-statuses, and ticket-priorities return the ids. Ticket create and update take those ids. An unknown id returns 422.

GET contacts to list and match. An exact PSA company name fills Match. An ambiguous name stays Needs match. Each row is Match, company import from PSA, or Skip. Company import creates the customer in the ISV. PSA company create is not supported: companies are created by the MSP, and POST /tenants/{tenant_id}/companies to the PSA returns 403 company_create_not_supported. Pax8 matches a company it already has, then creates the rest.

The MSP can approve or dismiss a mapped billing line item. Approve updates the quantity on the matched line of an existing agreement. Dismiss does not change the agreement. ConnectWise and Halo.

What we write lists the write paths and the error codes.

Validation

The payload is checked against that vendor’s rules before it leaves Bitlync.

Mechanism

A bad field fails on the request you sent. It does not create a ticket.

What the caller sees

HTTP 422. Branch on stable code validation.

422 on your request
HTTP 422

{
  "status": 422,
  "code": "validation"
}

A bad field returns 422 before a ticket is created.