MSP AlignMSP Align Suggest a feature Docs GitHub

REST API

MSP Align has a REST API for automation tools (n8n, Zapier, Power Automate), AI agents, scripts and other systems. It reads and changes planning data: clients, contacts, devices, projects, budgets, licensing, meetings, compliance, alignment reviews, health scores, backups, service levels and vendors. JSON in and out.

Alignment (2.3.0) has its own scope, alignment:read / alignment:write. Keys made before 2.3.0 don't have it: edit the key under Settings → API and tick Alignment.

Vendors (2.10.0) are read-only, with their own scope vendors:read: GET /vendors (each client's vendors as its Vendors page shows them; client_id, category, include_retired, updated_since), GET /vendors/{id} and GET /vendor-templates. Keys made before 2.10.0 don't have it: edit the key under Settings → API and tick Vendors.

What changed (2.4.0): GET /clients/{id}/changes returns what changed since the client's last completed business review (or ?since=m<meeting id> / ?since=YYYY-MM-DD). It needs clients:read; each part (devices, projects, alignment, compliance, licenses, backups, tickets) is included only when the key can read that area.

Health score (2.5.0) has its own scope, health:read. Keys made before 2.5.0 don't have it: edit the key under Settings → API and tick Health score. GET /clients/{id}/health returns the score, band and each area's score; an area's details (what pulls it down) come only when the key can also read that area. GET /clients/{id}/health/history returns one entry per day (?days=, default 90).

The reference below is generated from the same route table and validation rules the API itself uses, so it always matches the release it was built from. Your own server has the same reference under Settings → API → API reference, and serves the machine-readable description at https://<your server>/api/v1/openapi.json. Download the OpenAPI description (OpenAPI 3.1) for this release.

Getting started

  1. Turn it on: Settings → API → Turn on (admins only; it's off on a new install).
  2. Create a key: give it a name, the scopes it needs (read or write per area), and optionally limit it to some clients, set an expiry and a per-minute rate limit. The key (msa_…) is shown once; only a hash is kept.
  3. Call it: the base URL is https://<your server>/api/v1.
export ALIGN_KEY="msa_…"
curl -s -H "Authorization: Bearer $ALIGN_KEY" https://align.example.com/api/v1
curl -s -H "Authorization: Bearer $ALIGN_KEY" "https://align.example.com/api/v1/devices?attention=true&per_page=20"

Ids

Upgrading an integration from 1.x: before 2.0, psa_id was a number for ITFlow (57); now it is text ("57"). If a flow or script compares psa_id with a number, compare it as text or use the itflow_* field instead.

Compatibility

The API is versioned in its path (/api/v1). From 2.0 on, changes to v1 only add things: new endpoints, new fields in responses and new optional fields in requests. Ignore fields you don't know, rather than failing on them. Anything that would break an integration will come as a new version (/api/v2), announced in What's new, with v1 kept alongside it.

Permissions (scopes)

Each key has read or write access per area; write includes read.

AreaRead (area:read)Write (area:write)
Clients
clients
Clients, their details and a health summaryread only
Contacts
contacts
Client contacts and their rolesread only
Devices & lifecycle
devices
Devices with lifecycle status, warranty, OS support and replacement costPurchase / in-service and warranty dates, lifespan, replacement cost, planned replacement quarter, type, exclusion and notes
Projects & roadmap
projects
Roadmap projects and their statusCreate, change and delete projects (title, quarter, cost, priority, status)
Budget
budget
Technology budget by quarter and category, and budget linesCreate, change and delete budget lines
Licensing
licenses
Licenses with prices, contract dates and renewalsPrices, billing cycle, contract dates and notes; add, retire and delete licenses you added
Vendors
vendors
Client vendors (account numbers, support details, services, notes) and vendor templates (2.10.0)read only
Meetings
meetings
Meetings, agendas and notesSchedule, change, complete, cancel and delete meetings (optionally sending calendar invitations)
Compliance
compliance
Frameworks, scores and each control's statusControl status, notes, evidence, owner and due date; assign and remove frameworks
Alignment
alignment
Standards, clients' alignment scores, gaps and reviews with their answersStart reviews, answer standards, finish and discard reviews (2.3.0)
Backups
backups
Backup status, jobs, protected machines and hosted backups"Not required" exemptions and hosted backup assignments
Service levels
service
SLA results from PSA ticketsread only
Health score
health
Clients' health scores, each area's score and the daily history (2.5.0)read only

Errors

Statuserror.codeMeaning
400invalid_json, invalid_idempotency_keyThe request body or a header is malformed.
401missing_key, invalid_key, key_expired, key_revoked, key_owner_inactiveNo usable API key (a key stops when the staff account that created it is disabled or is no longer an admin).
403insufficient_scope, all_clients_requiredThe key lacks the permission (see the X-Required-Scope header).
404not_found, api_disabled, no_backup_data, no_service_dataNot found, or outside the clients the key is limited to.
405method_not_allowedSee the Allow header.
409idempotency_conflict, idempotency_in_progress, managed_in_itflow (managed_in_<PSA key> for other PSAs), not_enabledThe request conflicts with the current state.
413body_too_largeBodies are limited to 1 MB.
415unsupported_media_typeSend JSON with Content-Type: application/json.
422validation_failederror.fields names each problem.
429rate_limited, too_many_failed_requestsWait for Retry-After seconds. Requests without a valid key are also limited per IP address.
500internal_errorLogged on the server with the request_id.
{"error": {"code": "validation_failed", "message": "Some fields are not valid.", "fields": {"cost": "Must be a number."}}, "request_id": "9f2c41d0a7b3e815"}

Endpoints

MetaGET /
ClientsGET /clientsGET /clients/{id}GET /clients/{id}/changes
ContactsGET /contactsGET /clients/{id}/contactsGET /contacts/{id}
DevicesGET /devicesGET /devices/{id}PATCH /devices/{id}
ProjectsGET /projectsPOST /projectsGET /projects/{id}PATCH /projects/{id}DELETE /projects/{id}
BudgetGET /clients/{id}/budgetGET /budget-linesPOST /budget-linesGET /budget-lines/{id}PATCH /budget-lines/{id}DELETE /budget-lines/{id}
LicensingGET /licensesPOST /licensesGET /licenses/{id}PATCH /licenses/{id}DELETE /licenses/{id}
VendorsGET /vendorsGET /vendors/{id}GET /vendor-templates
MeetingsGET /meetingsPOST /meetingsGET /meetings/{id}PATCH /meetings/{id}DELETE /meetings/{id}
ComplianceGET /compliance/frameworksGET /clients/{id}/compliancePOST /clients/{id}/compliancePATCH /clients/{id}/compliance/{framework}DELETE /clients/{id}/compliance/{framework}GET /clients/{id}/compliance/{framework}/controlsPATCH /clients/{id}/compliance/{framework}/controlsPATCH /clients/{id}/compliance/{framework}/controls/{control}
HealthGET /clients/{id}/healthGET /clients/{id}/health/history
AlignmentGET /alignment/standardsGET /clients/{id}/alignmentGET /clients/{id}/alignment/reviewsPOST /clients/{id}/alignment/reviewsGET /clients/{id}/alignment/reviews/{review}DELETE /clients/{id}/alignment/reviews/{review}PATCH /clients/{id}/alignment/reviews/{review}/answersPOST /clients/{id}/alignment/reviews/{review}/finish
BackupsGET /backupsGET /clients/{id}/backupsGET /clients/{id}/backup-exemptionsPOST /clients/{id}/backup-exemptionsDELETE /clients/{id}/backup-exemptions/{exemption}GET /backups/hostedPUT /backups/hosted/machines/{uid}PUT /backups/hosted/jobs/{uid}
Service levelsGET /clients/{id}/service-levels

Meta

GET/api/v1

About this key

The key's name, scopes, client limit, expiry and rate limit. A cheap way to test a key.

Response: Key

The API key making the request.

FieldType
namestringName given to the key.
prefixstringPublic part of the key.
scopesarray of stringPermissions, e.g. projects:write.
client_idsarray of integerClients the key is limited to; null = all clients.
rate_limit_per_minuteinteger
expires_atdate-timenull = never.
api_versioninteger
app_versionstring
openapistringPath of the OpenAPI document.
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1

Clients

GET/api/v1/clientsclients:read

List clients

ParameterType
searchstringName contains.
include_excludedbooleanInclude clients taken out of planning.
updated_sincestringOnly items changed since this date/time (ISO 8601). Use it to sync incrementally.
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of Client

A client (details come from the PSA and are read-only).

FieldType
idinteger
namestring
industrystring
sourcestringThe PSA's key (e.g. itflow) or manual.
psa_idstringThe client's id in the PSA, always as text (e.g. "57" for ITFlow). Since 2.0; before, a number for ITFlow.
itflow_client_idintegerOlder name for psa_id, kept for existing integrations.
main_phonestring
websitestring
addressstring
primary_contactobjectname, title, email, phone, mobile.
vcioobjectStaff user who is vCIO for the client: id, name.
meeting_cadencestringHow often you meet.
in_planningbooleanfalse = taken out of planning.
created_atdate-time
updated_atdate-time
urlstringLink to the client in the web app.
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients
GET/api/v1/clients/{id}clients:read

Get a client with its health summary

The summary has a section for each area the key can read: devices, projects, next meeting, backups, compliance and service levels.

Response: ClientDetail

A client plus a health summary.

FieldType
idinteger
namestring
industrystring
sourcestringThe PSA's key (e.g. itflow) or manual.
psa_idstringThe client's id in the PSA, always as text (e.g. "57" for ITFlow). Since 2.0; before, a number for ITFlow.
itflow_client_idintegerOlder name for psa_id, kept for existing integrations.
main_phonestring
websitestring
addressstring
primary_contactobjectname, title, email, phone, mobile.
vcioobjectStaff user who is vCIO for the client: id, name.
meeting_cadencestringHow often you meet.
in_planningbooleanfalse = taken out of planning.
created_atdate-time
updated_atdate-time
urlstringLink to the client in the web app.
summaryobjectdevices {total, healthy, past_end_of_life, unsupported_os, out_of_warranty}, projects {active, awaiting_decision}, next_meeting, backups {health, jobs, failed_jobs, ...}, compliance {frameworks, average_score}, alignment {score, band, reviewed_at, gaps} (2.3.0), service_levels_90d. Only the sections the key can read.
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>
GET/api/v1/clients/{id}/changesclients:read

What changed since the last review

Projects finished, devices replaced, added and removed, warranties, end of life and OS support that ran out, alignment and compliance changes, licenses and tickets since the starting point. Each part is included only when the key can read its area (tickets need service:read). Then-figures come from the snapshot saved when the review was completed (since 2.3.0); without one they are null.

ParameterType
sincestringm (one of the client's completed business reviews) or YYYY-MM-DD; default: the newest completed review.
Response: Changes

What changed for a client since a business review (2.4.0).

FieldType
client_idinteger
sinceobjectkey, meeting_id, date, at, label, days, snapshot (then-figures saved at that review).
baselinesarray of objectCompleted reviews to compare with, newest first.
headlinearray of objecttone, title, text: a short summary.
devicesobjectnow, then, counts and lists: added, removed, replaced, warranty_expired, became_due, os_ended (devices:read).
projectsobjectcounts and lists: done, added, approved, started, declined (projects:read).
spendobjectdone_cost, done_monthly, slipped (projects:read).
alignmentobjectthen, now, change, closed and opened gaps (alignment:read).
complianceobjectframeworks with now, then, change, updated (compliance:read).
licensesobjectnow, then, added, retired (licenses:read).
backupobjectnow, then (backups:read).
ticketsobjectopened, closed, still_open, categories (service:read).
urlstring
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/changes

Contacts

GET/api/v1/contactscontacts:read

List contacts

ParameterType
client_idintegerOnly this client.
rolestringprimary, billing, technical, important, decision_maker or meeting_invitee.
searchstringName or email contains.
include_archivedbooleanInclude archived contacts.
updated_sincestringOnly items changed since this date/time (ISO 8601). Use it to sync incrementally.
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of Contact

A client contact.

FieldType
idinteger
client_idinteger
namestring
titlestring
departmentstring
emailstring
phonestring
extensionstring
mobilestring
locationstring
rolesarray of stringprimary, billing, technical, important, decision_maker, meeting_invitee.
notesstringAlign notes.
sourcestring
psa_idstringThe contact's id in the PSA (text, as psa_id on clients).
itflow_contact_idintegerOlder name for psa_id, kept for existing integrations.
archivedboolean
updated_atdate-time
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/contacts
GET/api/v1/clients/{id}/contactscontacts:read

List a client's contacts

ParameterType
rolestringFilter by role.
searchstringName or email contains.
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of Contact

A client contact.

FieldType
idinteger
client_idinteger
namestring
titlestring
departmentstring
emailstring
phonestring
extensionstring
mobilestring
locationstring
rolesarray of stringprimary, billing, technical, important, decision_maker, meeting_invitee.
notesstringAlign notes.
sourcestring
psa_idstringThe contact's id in the PSA (text, as psa_id on clients).
itflow_contact_idintegerOlder name for psa_id, kept for existing integrations.
archivedboolean
updated_atdate-time
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/contacts
GET/api/v1/contacts/{id}contacts:read

Get a contact

Response: Contact

A client contact.

FieldType
idinteger
client_idinteger
namestring
titlestring
departmentstring
emailstring
phonestring
extensionstring
mobilestring
locationstring
rolesarray of stringprimary, billing, technical, important, decision_maker, meeting_invitee.
notesstringAlign notes.
sourcestring
psa_idstringThe contact's id in the PSA (text, as psa_id on clients).
itflow_contact_idintegerOlder name for psa_id, kept for existing integrations.
archivedboolean
updated_atdate-time
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/contacts/<id>

Devices

GET/api/v1/devicesdevices:read

List devices with lifecycle status

ParameterType
client_idintegerOnly this client.
statusstringLifecycle status: replace, os_eos, plan, deferred, os_soon, warranty_expired, warranty_soon, ok, excluded, virtual.
attentionbooleanOnly devices that need attention (true) or don't (false).
typestringDevice type, e.g. Server, Laptop.
classstringCategory: desktop, laptop, server, network, printer, storage, power, other.
virtualbooleanOnly virtual (true) or physical (false).
searchstringName, serial, model or last user contains.
updated_sincestringOnly items changed since this date/time (ISO 8601). Use it to sync incrementally.
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of Device

A device with its computed lifecycle.

FieldType
idinteger
client_idinteger
client_namestring
namestring
typestringe.g. Server, Hypervisor host, Laptop.
categorystringLifecycle category: desktop, laptop, server, network, printer, storage, power, display (2.25.0), other.
is_virtualboolean
sourcestringninja (NinjaOne), another RMM's key, the PSA's key (e.g. itflow) or manual.
rmmobjectFor RMM devices: provider (e.g. ninjaone), device_id, organization_id. null otherwise.
manufacturerstring
modelstring
serialstring
asset_tagstringThe client's own asset tag (2.21.0), or null.
ip_addressstring
locationstring
last_userstring
last_seendate-time
osobjectname, build, support_ends.
lifecycleobjectstatus, status_label, health (ok/warn/bad/muted), flags, in_service_date, in_service_source, in_service_estimated, age_years, lifespan_years, end_of_life, replace_by, planned_replacement {quarter, label, note, deferred}, replacement_cost, excluded, project {id, title, status, target_quarter, psa_ticket_id}: the project replacing it (2.1; its devices leave the automatic plan, replace_by null).
warrantyobjectend, source.
overridesobjectValues set in Align (null = using the synced value or policy default).
psa_asset_idstringThe linked PSA asset (text, as psa_id on clients).
itflow_asset_idintegerOlder name for psa_asset_id, kept for existing integrations.
ninja_device_idintegerNinjaOne devices only: same as rmm.device_id. Older field, kept for existing integrations.
synced_atdate-time
urlstring
psa_syncobjectAfter PATCH only: status (ok, off, queued, error) and message.
itflow_syncobjectOlder name for psa_sync, kept for existing integrations.
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/devices
GET/api/v1/devices/{id}devices:read

Get a device

Response: Device

A device with its computed lifecycle.

FieldType
idinteger
client_idinteger
client_namestring
namestring
typestringe.g. Server, Hypervisor host, Laptop.
categorystringLifecycle category: desktop, laptop, server, network, printer, storage, power, display (2.25.0), other.
is_virtualboolean
sourcestringninja (NinjaOne), another RMM's key, the PSA's key (e.g. itflow) or manual.
rmmobjectFor RMM devices: provider (e.g. ninjaone), device_id, organization_id. null otherwise.
manufacturerstring
modelstring
serialstring
asset_tagstringThe client's own asset tag (2.21.0), or null.
ip_addressstring
locationstring
last_userstring
last_seendate-time
osobjectname, build, support_ends.
lifecycleobjectstatus, status_label, health (ok/warn/bad/muted), flags, in_service_date, in_service_source, in_service_estimated, age_years, lifespan_years, end_of_life, replace_by, planned_replacement {quarter, label, note, deferred}, replacement_cost, excluded, project {id, title, status, target_quarter, psa_ticket_id}: the project replacing it (2.1; its devices leave the automatic plan, replace_by null).
warrantyobjectend, source.
overridesobjectValues set in Align (null = using the synced value or policy default).
psa_asset_idstringThe linked PSA asset (text, as psa_id on clients).
itflow_asset_idintegerOlder name for psa_asset_id, kept for existing integrations.
ninja_device_idintegerNinjaOne devices only: same as rmm.device_id. Older field, kept for existing integrations.
synced_atdate-time
urlstring
psa_syncobjectAfter PATCH only: status (ok, off, queued, error) and message.
itflow_syncobjectOlder name for psa_sync, kept for existing integrations.
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/devices/<id>
PATCH/api/v1/devices/{id}devices:write

Change a device's lifecycle details

Same as editing the device page: dates, lifespan and cost override the synced values and the policy defaults; the change goes to the PSA when two-way sync is on. Send null to clear an override.

Body (JSON): send only what changes

FieldType
purchase_datedatePurchase / in-service date. Overrides what the RMM or PSA says. null = use the synced date.
warranty_enddateWarranty end. null = use the warranty lookup or PSA date.
lifespan_yearsintegerLifespan for this device. null = the policy default for its type. From 1 to 29.
replacement_costnumberReplacement cost. null = the policy default for its type. From 0 to 10,000,000.
replace_quarterstringPlan the replacement in this quarter instead of at end of life (2027-Q2 or any date in it). null = follow end of life.
replace_notestringWhy the replacement was moved (kept only with replace_quarter). Max 255 characters.
excludedbooleanLeave the device out of planning, budgets and reports.
notesstringAlign notes. Max 5000 characters.
asset_tagstringThe client's own asset tag (2.21.0). null = none. Not unique: the same tag on two devices is allowed. Max 64 characters.
device_typestringDevice type (sets its lifecycle category). null = the type the RMM reports (not for devices added in Align or the PSA, whose type is their own). One of: Desktop, VDI / virtual desktop, Laptop, Server, Hypervisor host, Virtual server, Firewall, Router, Switch, Access point, Printer, NAS / Storage, UPS, Monitor, Phone, Camera / NVR, Other, Unassigned.
Response: Device

A device with its computed lifecycle.

FieldType
idinteger
client_idinteger
client_namestring
namestring
typestringe.g. Server, Hypervisor host, Laptop.
categorystringLifecycle category: desktop, laptop, server, network, printer, storage, power, display (2.25.0), other.
is_virtualboolean
sourcestringninja (NinjaOne), another RMM's key, the PSA's key (e.g. itflow) or manual.
rmmobjectFor RMM devices: provider (e.g. ninjaone), device_id, organization_id. null otherwise.
manufacturerstring
modelstring
serialstring
asset_tagstringThe client's own asset tag (2.21.0), or null.
ip_addressstring
locationstring
last_userstring
last_seendate-time
osobjectname, build, support_ends.
lifecycleobjectstatus, status_label, health (ok/warn/bad/muted), flags, in_service_date, in_service_source, in_service_estimated, age_years, lifespan_years, end_of_life, replace_by, planned_replacement {quarter, label, note, deferred}, replacement_cost, excluded, project {id, title, status, target_quarter, psa_ticket_id}: the project replacing it (2.1; its devices leave the automatic plan, replace_by null).
warrantyobjectend, source.
overridesobjectValues set in Align (null = using the synced value or policy default).
psa_asset_idstringThe linked PSA asset (text, as psa_id on clients).
itflow_asset_idintegerOlder name for psa_asset_id, kept for existing integrations.
ninja_device_idintegerNinjaOne devices only: same as rmm.device_id. Older field, kept for existing integrations.
synced_atdate-time
urlstring
psa_syncobjectAfter PATCH only: status (ok, off, queued, error) and message.
itflow_syncobjectOlder name for psa_sync, kept for existing integrations.
curl -s -X PATCH -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" \
  -d '{"purchase_date": "2026-11-01", "warranty_end": "2026-11-01"}' \
  https://align.example.com/api/v1/devices/<id>

Projects

GET/api/v1/projectsprojects:read

List projects

ParameterType
client_idintegerOnly this client.
statusstringproposed, approved, scheduled, done or declined.
categorystringProject category.
quarterstringPlanned in this quarter (2027-Q1 or any date in it).
updated_sincestringOnly items changed since this date/time (ISO 8601). Use it to sync incrementally.
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of Project

A roadmap project.

FieldType
idinteger
client_idinteger
client_namestring
titlestring
categorystring
category_labelstring
descriptionstring
target_quarterdateFirst day of the planned quarter; null = backlog.
quarter_labelstringe.g. Q1 2027 or FY2027 Q3.
costnumberOne-time.
recurring_monthlynumber
prioritystringcritical, high, medium, low.
statusstringproposed, approved, scheduled, done, declined.
device_idsarray of integerDevices this project replaces (made from Devices → Make projects); they leave the automatic replacement plan while the project isn't declined.
psa_ticket_idstringThe project's QUOTE- ticket in the PSA, once someone pressed Ready to start (or asked for it when the project was made); null until then.
started_atdate-timeWhen Ready to start was first pressed: the ticket was made, or (with no ticket possible, e.g. no PSA) the project was marked started; a ticket made later keeps this date. Null until then; projects whose ticket was made before 2.2.2 have none.
decisionobjectWho approved or declined it (e.g. in the client portal): by, at, comment, via_portal.
alignment_standard_idintegerThe alignment standard this project fixes (made from a gap, 2.3.0); null otherwise.
created_atdate-time
updated_atdate-time
urlstring
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/projects
POST/api/v1/projectsprojects:write

Create a project

ParameterType
Idempotency-Key (header)stringSend a unique value to make retries safe: the same key within 24 hours returns the first response instead of creating a duplicate.

Body (JSON)

FieldType
client_id requiredintegerClient the project belongs to (can't be changed later).
title requiredstringProject name. Max 255 characters.
categorystringCategory (default "project"). One of: hardware, infrastructure, security, compliance, software, cloud, backup, project, training.
descriptionstringPlain-language description the client will read. Max 10000 characters.
target_quarterstringPlanned quarter (2027-Q1 or any date in it; returned as the quarter's first day). null = backlog.
costnumberOne-time cost. From 0 to 100,000,000.
recurring_monthlynumberAdded monthly cost once done. From 0 to 10,000,000.
prioritystringPriority (default "medium"). One of: critical, high, medium, low.
statusstringStatus (default "proposed"). Approved and scheduled projects roll into the budget. One of: proposed, approved, scheduled, done, declined.
alignment_standard_idintegerThe alignment standard this project fixes (GET /alignment/standards).
Response: Project

A roadmap project.

FieldType
idinteger
client_idinteger
client_namestring
titlestring
categorystring
category_labelstring
descriptionstring
target_quarterdateFirst day of the planned quarter; null = backlog.
quarter_labelstringe.g. Q1 2027 or FY2027 Q3.
costnumberOne-time.
recurring_monthlynumber
prioritystringcritical, high, medium, low.
statusstringproposed, approved, scheduled, done, declined.
device_idsarray of integerDevices this project replaces (made from Devices → Make projects); they leave the automatic replacement plan while the project isn't declined.
psa_ticket_idstringThe project's QUOTE- ticket in the PSA, once someone pressed Ready to start (or asked for it when the project was made); null until then.
started_atdate-timeWhen Ready to start was first pressed: the ticket was made, or (with no ticket possible, e.g. no PSA) the project was marked started; a ticket made later keeps this date. Null until then; projects whose ticket was made before 2.2.2 have none.
decisionobjectWho approved or declined it (e.g. in the client portal): by, at, comment, via_portal.
alignment_standard_idintegerThe alignment standard this project fixes (made from a gap, 2.3.0); null otherwise.
created_atdate-time
updated_atdate-time
urlstring
curl -s -X POST -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" -H "Idempotency-Key: $(uuidgen)" \
  -d '{"client_id": 12, "title": "text"}' \
  https://align.example.com/api/v1/projects
GET/api/v1/projects/{id}projects:read

Get a project

Response: Project

A roadmap project.

FieldType
idinteger
client_idinteger
client_namestring
titlestring
categorystring
category_labelstring
descriptionstring
target_quarterdateFirst day of the planned quarter; null = backlog.
quarter_labelstringe.g. Q1 2027 or FY2027 Q3.
costnumberOne-time.
recurring_monthlynumber
prioritystringcritical, high, medium, low.
statusstringproposed, approved, scheduled, done, declined.
device_idsarray of integerDevices this project replaces (made from Devices → Make projects); they leave the automatic replacement plan while the project isn't declined.
psa_ticket_idstringThe project's QUOTE- ticket in the PSA, once someone pressed Ready to start (or asked for it when the project was made); null until then.
started_atdate-timeWhen Ready to start was first pressed: the ticket was made, or (with no ticket possible, e.g. no PSA) the project was marked started; a ticket made later keeps this date. Null until then; projects whose ticket was made before 2.2.2 have none.
decisionobjectWho approved or declined it (e.g. in the client portal): by, at, comment, via_portal.
alignment_standard_idintegerThe alignment standard this project fixes (made from a gap, 2.3.0); null otherwise.
created_atdate-time
updated_atdate-time
urlstring
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/projects/<id>
PATCH/api/v1/projects/{id}projects:write

Change a project

Body (JSON): send only what changes

FieldType
titlestringProject name. Max 255 characters.
categorystringCategory (default "project"). One of: hardware, infrastructure, security, compliance, software, cloud, backup, project, training.
descriptionstringPlain-language description the client will read. Max 10000 characters.
target_quarterstringPlanned quarter (2027-Q1 or any date in it; returned as the quarter's first day). null = backlog.
costnumberOne-time cost. From 0 to 100,000,000.
recurring_monthlynumberAdded monthly cost once done. From 0 to 10,000,000.
prioritystringPriority (default "medium"). One of: critical, high, medium, low.
statusstringStatus (default "proposed"). Approved and scheduled projects roll into the budget. One of: proposed, approved, scheduled, done, declined.
Response: Project

A roadmap project.

FieldType
idinteger
client_idinteger
client_namestring
titlestring
categorystring
category_labelstring
descriptionstring
target_quarterdateFirst day of the planned quarter; null = backlog.
quarter_labelstringe.g. Q1 2027 or FY2027 Q3.
costnumberOne-time.
recurring_monthlynumber
prioritystringcritical, high, medium, low.
statusstringproposed, approved, scheduled, done, declined.
device_idsarray of integerDevices this project replaces (made from Devices → Make projects); they leave the automatic replacement plan while the project isn't declined.
psa_ticket_idstringThe project's QUOTE- ticket in the PSA, once someone pressed Ready to start (or asked for it when the project was made); null until then.
started_atdate-timeWhen Ready to start was first pressed: the ticket was made, or (with no ticket possible, e.g. no PSA) the project was marked started; a ticket made later keeps this date. Null until then; projects whose ticket was made before 2.2.2 have none.
decisionobjectWho approved or declined it (e.g. in the client portal): by, at, comment, via_portal.
alignment_standard_idintegerThe alignment standard this project fixes (made from a gap, 2.3.0); null otherwise.
created_atdate-time
updated_atdate-time
urlstring
curl -s -X PATCH -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" \
  -d '{"title": "text", "category": "hardware"}' \
  https://align.example.com/api/v1/projects/<id>
DELETE/api/v1/projects/{id}projects:write

Delete a project

Returns 204 No Content.

curl -s -X DELETE -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/projects/<id>

Budget

GET/api/v1/clients/{id}/budgetbudget:read

Get a client's three-year technology budget

Everything the budget page shows: totals per year and quarter by category, recurring monthly run rate, each line (licensing, hardware, projects, managed services and your budget lines) and upcoming contract dates.

ParameterType
yearintegerWhich plan year the selected_year block shows: 0 (default), 1 or 2.
Response: BudgetSummary

A client's three-year technology budget.

FieldType
client_idinteger
currencystring
recurring_monthlynumberCurrent recurring monthly run rate.
selected_yearobjectlabel, from, to, total, one_time, by_category.
yearsarray of objectThe three plan years, same shape.
quartersarray of objectlabel, start, end, year_index, total, by_category.
categoriesobjectCategory key => label.
linesarray of objectEvery budget line: key, name, category, source (manual, licensing, hardware, projects, or the PSA's key for the managed-services estimate), budget_line_id, detail, monthly, one_time, tentative, by_quarter (12 values).
contract_datesarray of objectdate, kind, label, name, term, auto_renew, annual_value.
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/budget
GET/api/v1/budget-linesbudget:read

List budget lines

ParameterType
client_idintegerOnly this client.
categorystringBudget category.
updated_sincestringOnly items changed since this date/time (ISO 8601). Use it to sync incrementally.
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of BudgetLine

A budget line you added.

FieldType
idinteger
client_idinteger
namestring
categorystring
vendorstring
amountnumberPer billing period.
frequencystringmonthly, quarterly, annual, one_time.
start_datedate
end_datedate
contract_term_monthsinteger
contract_enddate
notice_daysinteger
renegotiate_datedate
auto_renewboolean
notesstring
created_atdate-time
updated_atdate-time
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/budget-lines
POST/api/v1/budget-linesbudget:write

Create a budget line

ParameterType
Idempotency-Key (header)stringSend a unique value to make retries safe: the same key within 24 hours returns the first response instead of creating a duplicate.

Body (JSON)

FieldType
client_id requiredintegerClient (can't be changed later).
name requiredstringWhat the cost is for. Max 255 characters.
categorystringBudget category (default "other"). A "managed" line replaces the managed-services estimate from PSA invoices. One of: managed, licensing, hardware, projects, connectivity, telecom, cloud, other.
vendorstring Max 190 characters.
amount requirednumberAmount per billing period. From 0 to 100,000,000.
frequencystringHow often it's billed (default "monthly"). One of: monthly, quarterly, annual, one_time.
start_datedateFirst billing date (null = already running).
end_datedateLast billing date (null = ongoing).
contract_term_monthsinteger From 1 to 240.
contract_enddateWorked out from start_date + term when left out.
notice_daysinteger From 0 to 730.
renegotiate_datedateLast day to give notice. Worked out from contract_end - notice_days when left out.
auto_renewboolean
notesstring Max 5000 characters.
Response: BudgetLine

A budget line you added.

FieldType
idinteger
client_idinteger
namestring
categorystring
vendorstring
amountnumberPer billing period.
frequencystringmonthly, quarterly, annual, one_time.
start_datedate
end_datedate
contract_term_monthsinteger
contract_enddate
notice_daysinteger
renegotiate_datedate
auto_renewboolean
notesstring
created_atdate-time
updated_atdate-time
curl -s -X POST -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" -H "Idempotency-Key: $(uuidgen)" \
  -d '{"client_id": 12, "name": "text", "amount": 1500}' \
  https://align.example.com/api/v1/budget-lines
GET/api/v1/budget-lines/{id}budget:read

Get a budget line

Response: BudgetLine

A budget line you added.

FieldType
idinteger
client_idinteger
namestring
categorystring
vendorstring
amountnumberPer billing period.
frequencystringmonthly, quarterly, annual, one_time.
start_datedate
end_datedate
contract_term_monthsinteger
contract_enddate
notice_daysinteger
renegotiate_datedate
auto_renewboolean
notesstring
created_atdate-time
updated_atdate-time
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/budget-lines/<id>
PATCH/api/v1/budget-lines/{id}budget:write

Change a budget line

Body (JSON): send only what changes

FieldType
namestringWhat the cost is for. Max 255 characters.
categorystringBudget category (default "other"). A "managed" line replaces the managed-services estimate from PSA invoices. One of: managed, licensing, hardware, projects, connectivity, telecom, cloud, other.
vendorstring Max 190 characters.
amountnumberAmount per billing period. From 0 to 100,000,000.
frequencystringHow often it's billed (default "monthly"). One of: monthly, quarterly, annual, one_time.
start_datedateFirst billing date (null = already running).
end_datedateLast billing date (null = ongoing).
contract_term_monthsinteger From 1 to 240.
contract_enddateWorked out from start_date + term when left out.
notice_daysinteger From 0 to 730.
renegotiate_datedateLast day to give notice. Worked out from contract_end - notice_days when left out.
auto_renewboolean
notesstring Max 5000 characters.
Response: BudgetLine

A budget line you added.

FieldType
idinteger
client_idinteger
namestring
categorystring
vendorstring
amountnumberPer billing period.
frequencystringmonthly, quarterly, annual, one_time.
start_datedate
end_datedate
contract_term_monthsinteger
contract_enddate
notice_daysinteger
renegotiate_datedate
auto_renewboolean
notesstring
created_atdate-time
updated_atdate-time
curl -s -X PATCH -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" \
  -d '{"name": "text", "category": "managed"}' \
  https://align.example.com/api/v1/budget-lines/<id>
DELETE/api/v1/budget-lines/{id}budget:write

Delete a budget line

Returns 204 No Content.

curl -s -X DELETE -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/budget-lines/<id>

Licensing

GET/api/v1/licenseslicenses:read

List licenses

ParameterType
client_idintegerOnly this client.
categorystringLicense category.
unpricedbooleanOnly licenses without a price.
renewing_within_daysintegerExpiry, contract end or renegotiate-by date within this many days.
include_retiredbooleanInclude retired licenses.
updated_sincestringOnly items changed since this date/time (ISO 8601). Use it to sync incrementally.
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of License

A software license or subscription.

FieldType
idinteger
client_idinteger
sourcestringThe PSA's key (e.g. itflow), m365 (from the client's Microsoft 365 tenant, 2.6.0), gws (from its Google Workspace, 2.6.3) or manual.
psa_idstringThe license's id in the PSA (text, as psa_id on clients).
itflow_software_idintegerOlder name for psa_id, kept for existing integrations.
namestring
versionstring
software_typestring
license_typestring
categorystring
vendorstring
seatsinteger
seats_usedinteger
pricingstringper_seat or flat.
unit_pricenumber
price_sourcestringMicrosoft 365 licenses (2.6.0) and Google Workspace licenses (2.6.3): list (follows the price list) or custom (this license has its own price); null for others.
billing_cyclestring
pricedboolean
cost_per_cyclenumber
monthlynumber
annualnumber
purchase_datedate
expire_datedate
auto_renewboolean
contract_startdate
contract_term_monthsinteger
contract_enddate
notice_daysinteger
renegotiate_datedate
notesstringAlign notes.
psa_notesstringNotes from the PSA.
itflow_notesstringOlder name for psa_notes, kept for existing integrations.
retiredboolean
updated_atdate-time
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/licenses
POST/api/v1/licenseslicenses:write

Add a license

For licenses you track only in Align. Licenses from the PSA arrive with the sync.

ParameterType
Idempotency-Key (header)stringSend a unique value to make retries safe: the same key within 24 hours returns the first response instead of creating a duplicate.

Body (JSON)

FieldType
client_id requiredintegerClient (can't be changed later).
name requiredstringProduct name (read-only for licenses synced from the PSA). Max 255 characters.
versionstring Max 100 characters.
software_typestring Max 60 characters.
license_typestring One of: user, device, site, other.
seatsintegerSeats purchased (read-only for licenses synced from the PSA). From 0 to 1,000,000.
vendorstring Max 190 characters.
purchase_datedate
expire_datedateRenewal / expiry date (read-only for licenses synced from the PSA).
categorystring One of: productivity, security, backup, lob, infrastructure, communication, rmm, other.
pricingstringper_seat: unit_price × seats; flat: unit_price is the whole charge. One of: per_seat, flat.
unit_pricenumberPrice per seat (or flat price) per billing period. null = not priced yet. From 0 to 10,000,000.
billing_cyclestring One of: monthly, quarterly, annual, one_time.
seats_usedinteger From 0 to 1,000,000.
auto_renewboolean
contract_startdate
contract_term_monthsinteger From 1 to 240.
contract_enddateWorked out from contract_start (or purchase_date) + term when left out.
notice_daysinteger From 0 to 730.
renegotiate_datedateWorked out from contract_end - notice_days when left out.
notesstringAlign notes. Max 5000 characters.
Response: License

A software license or subscription.

FieldType
idinteger
client_idinteger
sourcestringThe PSA's key (e.g. itflow), m365 (from the client's Microsoft 365 tenant, 2.6.0), gws (from its Google Workspace, 2.6.3) or manual.
psa_idstringThe license's id in the PSA (text, as psa_id on clients).
itflow_software_idintegerOlder name for psa_id, kept for existing integrations.
namestring
versionstring
software_typestring
license_typestring
categorystring
vendorstring
seatsinteger
seats_usedinteger
pricingstringper_seat or flat.
unit_pricenumber
price_sourcestringMicrosoft 365 licenses (2.6.0) and Google Workspace licenses (2.6.3): list (follows the price list) or custom (this license has its own price); null for others.
billing_cyclestring
pricedboolean
cost_per_cyclenumber
monthlynumber
annualnumber
purchase_datedate
expire_datedate
auto_renewboolean
contract_startdate
contract_term_monthsinteger
contract_enddate
notice_daysinteger
renegotiate_datedate
notesstringAlign notes.
psa_notesstringNotes from the PSA.
itflow_notesstringOlder name for psa_notes, kept for existing integrations.
retiredboolean
updated_atdate-time
curl -s -X POST -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" -H "Idempotency-Key: $(uuidgen)" \
  -d '{"client_id": 12, "name": "text"}' \
  https://align.example.com/api/v1/licenses
GET/api/v1/licenses/{id}licenses:read

Get a license

Response: License

A software license or subscription.

FieldType
idinteger
client_idinteger
sourcestringThe PSA's key (e.g. itflow), m365 (from the client's Microsoft 365 tenant, 2.6.0), gws (from its Google Workspace, 2.6.3) or manual.
psa_idstringThe license's id in the PSA (text, as psa_id on clients).
itflow_software_idintegerOlder name for psa_id, kept for existing integrations.
namestring
versionstring
software_typestring
license_typestring
categorystring
vendorstring
seatsinteger
seats_usedinteger
pricingstringper_seat or flat.
unit_pricenumber
price_sourcestringMicrosoft 365 licenses (2.6.0) and Google Workspace licenses (2.6.3): list (follows the price list) or custom (this license has its own price); null for others.
billing_cyclestring
pricedboolean
cost_per_cyclenumber
monthlynumber
annualnumber
purchase_datedate
expire_datedate
auto_renewboolean
contract_startdate
contract_term_monthsinteger
contract_enddate
notice_daysinteger
renegotiate_datedate
notesstringAlign notes.
psa_notesstringNotes from the PSA.
itflow_notesstringOlder name for psa_notes, kept for existing integrations.
retiredboolean
updated_atdate-time
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/licenses/<id>
PATCH/api/v1/licenses/{id}licenses:write

Change a license

For licenses synced from the PSA, name, version, type, seats, vendor and dates are managed there and refused here.

Body (JSON): send only what changes

FieldType
namestringProduct name (read-only for licenses synced from the PSA). Max 255 characters.
versionstring Max 100 characters.
software_typestring Max 60 characters.
license_typestring One of: user, device, site, other.
seatsintegerSeats purchased (read-only for licenses synced from the PSA). From 0 to 1,000,000.
vendorstring Max 190 characters.
purchase_datedate
expire_datedateRenewal / expiry date (read-only for licenses synced from the PSA).
categorystring One of: productivity, security, backup, lob, infrastructure, communication, rmm, other.
pricingstringper_seat: unit_price × seats; flat: unit_price is the whole charge. One of: per_seat, flat.
unit_pricenumberPrice per seat (or flat price) per billing period. null = not priced yet. From 0 to 10,000,000.
billing_cyclestring One of: monthly, quarterly, annual, one_time.
seats_usedinteger From 0 to 1,000,000.
auto_renewboolean
contract_startdate
contract_term_monthsinteger From 1 to 240.
contract_enddateWorked out from contract_start (or purchase_date) + term when left out.
notice_daysinteger From 0 to 730.
renegotiate_datedateWorked out from contract_end - notice_days when left out.
notesstringAlign notes. Max 5000 characters.
retiredbooleanRetire (true) or restore (false). Retired licenses don't count toward totals.
Response: License

A software license or subscription.

FieldType
idinteger
client_idinteger
sourcestringThe PSA's key (e.g. itflow), m365 (from the client's Microsoft 365 tenant, 2.6.0), gws (from its Google Workspace, 2.6.3) or manual.
psa_idstringThe license's id in the PSA (text, as psa_id on clients).
itflow_software_idintegerOlder name for psa_id, kept for existing integrations.
namestring
versionstring
software_typestring
license_typestring
categorystring
vendorstring
seatsinteger
seats_usedinteger
pricingstringper_seat or flat.
unit_pricenumber
price_sourcestringMicrosoft 365 licenses (2.6.0) and Google Workspace licenses (2.6.3): list (follows the price list) or custom (this license has its own price); null for others.
billing_cyclestring
pricedboolean
cost_per_cyclenumber
monthlynumber
annualnumber
purchase_datedate
expire_datedate
auto_renewboolean
contract_startdate
contract_term_monthsinteger
contract_enddate
notice_daysinteger
renegotiate_datedate
notesstringAlign notes.
psa_notesstringNotes from the PSA.
itflow_notesstringOlder name for psa_notes, kept for existing integrations.
retiredboolean
updated_atdate-time
curl -s -X PATCH -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" \
  -d '{"name": "text", "version": "text"}' \
  https://align.example.com/api/v1/licenses/<id>
DELETE/api/v1/licenses/{id}licenses:write

Delete a license you added

Returns 204 No Content.

curl -s -X DELETE -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/licenses/<id>

Vendors

GET/api/v1/vendorsvendors:read

List client vendors

Each client's vendors as its Vendors page shows them: a field left blank on the vendor takes its template's value (from_template lists which).

ParameterType
client_idintegerOnly this client.
categorystringVendor category (its own, else its template's).
include_retiredbooleanInclude retired vendors.
updated_sincestringOnly items changed since this date/time (ISO 8601). Use it to sync incrementally.
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of Vendor

A client's vendor (2.10.0), as its Vendors page shows it.

FieldType
idinteger
client_idinteger
client_namestring
sourcestringThe PSA's key (e.g. itflow) for vendors synced from it, else manual.
psa_idstringThe vendor's id in the PSA.
template_idintegerThe vendor template it uses, or null.
template_namestring
namestring
categorystringinternet, phone, registrar, hosting, software, lob, security, print, hardware or other.
descriptionstringFrom the PSA.
account_numberstring
contact_namestring
support_phonestring
support_emailstring
websitestring
hoursstring
slastring
servicesstringWhat the client has from this vendor.
notesstringAlign notes.
psa_notesstringNotes from the PSA (synced vendors).
from_templatearray of stringThe fields shown from the template (blank on the vendor itself).
retiredboolean
retired_reasonstringpsa (archived or deleted in the PSA) or align.
created_atdate-time
updated_atdate-time
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/vendors
GET/api/v1/vendors/{id}vendors:read

Get a client vendor

Response: Vendor

A client's vendor (2.10.0), as its Vendors page shows it.

FieldType
idinteger
client_idinteger
client_namestring
sourcestringThe PSA's key (e.g. itflow) for vendors synced from it, else manual.
psa_idstringThe vendor's id in the PSA.
template_idintegerThe vendor template it uses, or null.
template_namestring
namestring
categorystringinternet, phone, registrar, hosting, software, lob, security, print, hardware or other.
descriptionstringFrom the PSA.
account_numberstring
contact_namestring
support_phonestring
support_emailstring
websitestring
hoursstring
slastring
servicesstringWhat the client has from this vendor.
notesstringAlign notes.
psa_notesstringNotes from the PSA (synced vendors).
from_templatearray of stringThe fields shown from the template (blank on the vendor itself).
retiredboolean
retired_reasonstringpsa (archived or deleted in the PSA) or align.
created_atdate-time
updated_atdate-time
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/vendors/<id>
GET/api/v1/vendor-templatesvendors:read

List vendor templates

The shared vendor details entered once, with how many clients use each. Not paginated.

Response: VendorTemplate

A vendor template (2.10.0): details shared by every client that uses it.

FieldType
idinteger
namestring
categorystring
websitestring
support_phonestring
support_emailstring
hoursstring
slastring
notesstring
psa_template_idstringThe PSA's vendor template it stands for, or null.
clientsintegerClients with an active vendor made from it.
updated_atdate-time
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/vendor-templates

Meetings

GET/api/v1/meetingsmeetings:read

List meetings

ParameterType
client_idintegerOnly this client.
fromstringStarting on or after (date or date-time).
tostringStarting on or before.
statusstringscheduled, completed or cancelled.
typestringMeeting type.
updated_sincestringOnly items changed since this date/time (ISO 8601). Use it to sync incrementally.
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of Meeting

A meeting.

FieldType
idinteger
client_idintegernull = internal.
titlestring
typestring
type_labelstring
statusstringscheduled, completed, cancelled.
starts_atdate-time
ends_atdate-time
duration_minutesinteger
locationstring
video_urlstring
attendeesarray of objectemail, name.
agendastring
notesstring
ownerobjectid, name.
series_idinteger
invitations_sent_atdate-time
created_atdate-time
updated_atdate-time
urlstring
invitationsstringAfter POST/PATCH with send_invites: what happened to the invitations.
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/meetings
POST/api/v1/meetingsmeetings:write

Schedule a meeting

ParameterType
Idempotency-Key (header)stringSend a unique value to make retries safe: the same key within 24 hours returns the first response instead of creating a duplicate.

Body (JSON)

FieldType
client_idintegerClient (null = internal meeting; needs a key for all clients).
titlestringTitle (default: the meeting type's name). Max 255 characters.
typestringMeeting type (default "other"). One of: abr, qbr, tbr, strategy, onboarding, compliance, project, internal, other.
starts_at requireddate-timeStart, ISO 8601 (e.g. 2026-10-14T09:00:00-07:00). Without an offset the server's time zone is used.
duration_minutesintegerLength (default from Settings → Planning). From 15 to 600.
locationstring Max 255 characters.
video_urluriTeams / Meet / Zoom link.
attendeesarray of stringList of "email" or "Name ".
agendastring Max 20000 characters.
owner_idintegerStaff user (tech or admin) who owns / organizes it (default: the key's creator). Invitations can go out from this person's mailbox, so only keys for all clients may set it.
send_invitesbooleanEmail calendar invitations (or updates) to the attendees. Default false. Needs a key for all clients.
Response: Meeting

A meeting.

FieldType
idinteger
client_idintegernull = internal.
titlestring
typestring
type_labelstring
statusstringscheduled, completed, cancelled.
starts_atdate-time
ends_atdate-time
duration_minutesinteger
locationstring
video_urlstring
attendeesarray of objectemail, name.
agendastring
notesstring
ownerobjectid, name.
series_idinteger
invitations_sent_atdate-time
created_atdate-time
updated_atdate-time
urlstring
invitationsstringAfter POST/PATCH with send_invites: what happened to the invitations.
curl -s -X POST -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" -H "Idempotency-Key: $(uuidgen)" \
  -d '{"starts_at": "2026-11-04T09:00:00-08:00"}' \
  https://align.example.com/api/v1/meetings
GET/api/v1/meetings/{id}meetings:read

Get a meeting

Response: Meeting

A meeting.

FieldType
idinteger
client_idintegernull = internal.
titlestring
typestring
type_labelstring
statusstringscheduled, completed, cancelled.
starts_atdate-time
ends_atdate-time
duration_minutesinteger
locationstring
video_urlstring
attendeesarray of objectemail, name.
agendastring
notesstring
ownerobjectid, name.
series_idinteger
invitations_sent_atdate-time
created_atdate-time
updated_atdate-time
urlstring
invitationsstringAfter POST/PATCH with send_invites: what happened to the invitations.
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/meetings/<id>
PATCH/api/v1/meetings/{id}meetings:write

Change, complete or cancel a meeting

Body (JSON): send only what changes

FieldType
client_idintegerClient (null = internal meeting; needs a key for all clients).
titlestringTitle (default: the meeting type's name). Max 255 characters.
typestringMeeting type (default "other"). One of: abr, qbr, tbr, strategy, onboarding, compliance, project, internal, other.
starts_atdate-timeStart, ISO 8601 (e.g. 2026-10-14T09:00:00-07:00). Without an offset the server's time zone is used.
duration_minutesintegerLength (default from Settings → Planning). From 15 to 600.
locationstring Max 255 characters.
video_urluriTeams / Meet / Zoom link.
attendeesarray of stringList of "email" or "Name ".
agendastring Max 20000 characters.
owner_idintegerStaff user (tech or admin) who owns / organizes it (default: the key's creator). Invitations can go out from this person's mailbox, so only keys for all clients may set it.
statusstringMark completed or cancelled (cancelling sends cancellations if invitations went out), or scheduled to reopen. One of: scheduled, completed, cancelled.
notesstringMeeting notes. Max 50000 characters.
send_invitesbooleanEmail calendar invitations (or updates) to the attendees. Default false. Needs a key for all clients.
Response: Meeting

A meeting.

FieldType
idinteger
client_idintegernull = internal.
titlestring
typestring
type_labelstring
statusstringscheduled, completed, cancelled.
starts_atdate-time
ends_atdate-time
duration_minutesinteger
locationstring
video_urlstring
attendeesarray of objectemail, name.
agendastring
notesstring
ownerobjectid, name.
series_idinteger
invitations_sent_atdate-time
created_atdate-time
updated_atdate-time
urlstring
invitationsstringAfter POST/PATCH with send_invites: what happened to the invitations.
curl -s -X PATCH -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" \
  -d '{"client_id": 12, "title": "text"}' \
  https://align.example.com/api/v1/meetings/<id>
DELETE/api/v1/meetings/{id}meetings:write

Delete a meeting

Attendees get a cancellation first if invitations had gone out.

Returns 204 No Content.

curl -s -X DELETE -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/meetings/<id>

Compliance

GET/api/v1/compliance/frameworkscompliance:read

List frameworks

ParameterType
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of Framework

A compliance framework.

FieldType
idinteger
slugstring
namestring
descriptionstring
built_inboolean
controlsinteger
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/compliance/frameworks
GET/api/v1/clients/{id}/compliancecompliance:read

List a client's frameworks with scores

ParameterType
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of Assessment

A framework assigned to a client, with its score.

FieldType
client_idinteger
framework_idinteger
frameworkstring
slugstring
assigned_atdate-time
last_revieweddate
next_reviewdate
scoreobjectpercent (partial counts half), met, partial, not_met, not_assessed, applicable, assessed_percent.
urlstring
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/compliance
POST/api/v1/clients/{id}/compliancecompliance:write

Assign a framework to a client

ParameterType
Idempotency-Key (header)stringSend a unique value to make retries safe: the same key within 24 hours returns the first response instead of creating a duplicate.

Body (JSON)

FieldType
framework_id requiredintegerFramework to assign.
next_reviewdateNext review (default one year).
Response: Assessment

A framework assigned to a client, with its score.

FieldType
client_idinteger
framework_idinteger
frameworkstring
slugstring
assigned_atdate-time
last_revieweddate
next_reviewdate
scoreobjectpercent (partial counts half), met, partial, not_met, not_assessed, applicable, assessed_percent.
urlstring
curl -s -X POST -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" -H "Idempotency-Key: $(uuidgen)" \
  -d '{"framework_id": 1}' \
  https://align.example.com/api/v1/clients/<id>/compliance
PATCH/api/v1/clients/{id}/compliance/{framework}compliance:write

Set review dates

Body (JSON): send only what changes

FieldType
next_reviewdate
last_revieweddate
Response: Assessment

A framework assigned to a client, with its score.

FieldType
client_idinteger
framework_idinteger
frameworkstring
slugstring
assigned_atdate-time
last_revieweddate
next_reviewdate
scoreobjectpercent (partial counts half), met, partial, not_met, not_assessed, applicable, assessed_percent.
urlstring
curl -s -X PATCH -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" \
  -d '{"next_review": "2026-11-01", "last_reviewed": "2026-11-01"}' \
  https://align.example.com/api/v1/clients/<id>/compliance/<framework>
DELETE/api/v1/clients/{id}/compliance/{framework}compliance:write

Remove a framework from a client

Answers are kept and come back if the framework is assigned again.

Returns 204 No Content.

curl -s -X DELETE -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/compliance/<framework>
GET/api/v1/clients/{id}/compliance/{framework}/controlscompliance:read

List controls with the client's status

ParameterType
statusstringnot_assessed, met, partial, not_met or na.
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of Control

A control and the client's status for it.

FieldType
idinteger
refstring
sectionstring
titlestring
guidancestringWhat "met" looks like and the evidence to collect.
automatic_checkstringCheck Align runs from its own data, if any.
crosswalk_tagsarray of string
statusstring
notesstring
evidencestring
ownerstring
due_datedate
document_idinteger
updated_atdate-time
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/compliance/<framework>/controls
PATCH/api/v1/clients/{id}/compliance/{framework}/controlscompliance:write

Update many controls

Body (JSON): send only what changes

FieldType
controlsarray of objectUp to 500 items: {"id": , "status": "met", "notes": "..."}. All or nothing.
Response: BulkResult

Result of a bulk update.

FieldType
updatedinteger
unchangedinteger
assessmentobjectThe framework's score afterwards.
curl -s -X PATCH -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" \
  -d '{"controls": [{"id": 101, "status": "met"}]}' \
  https://align.example.com/api/v1/clients/<id>/compliance/<framework>/controls
PATCH/api/v1/clients/{id}/compliance/{framework}/controls/{control}compliance:write

Update one control

Body (JSON): send only what changes

FieldType
statusstringAssessment result. One of: not_assessed, met, partial, not_met, na.
notesstring Max 5000 characters.
evidencestringWhere the evidence is (link, file name, ticket). Max 2000 characters.
ownerstringWho is responsible. Max 190 characters.
due_datedate
document_idintegerLinked Align document (must belong to the client).
Response: Control

A control and the client's status for it.

FieldType
idinteger
refstring
sectionstring
titlestring
guidancestringWhat "met" looks like and the evidence to collect.
automatic_checkstringCheck Align runs from its own data, if any.
crosswalk_tagsarray of string
statusstring
notesstring
evidencestring
ownerstring
due_datedate
document_idinteger
updated_atdate-time
curl -s -X PATCH -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" \
  -d '{"status": "not_assessed", "notes": "text"}' \
  https://align.example.com/api/v1/clients/<id>/compliance/<framework>/controls/<control>

Health

GET/api/v1/clients/{id}/healthhealth:read

Get a client's health score

One score from 0 to 100 made from lifecycle, backups, compliance, service levels and alignment, each scored 0 to 100 and weighted as set in Settings → Planning & lifecycle. An area with no data is left out. Each area's details (what pulls it down) are included only when the key can read that area; otherwise details is null. Worked out now, and stored as today's entry in the history.

Response: Health

A client's health score (2.5.0).

FieldType
client_idinteger
scoreinteger0-100; null when no area has data.
bandstringHealthy, Needs attention, At risk or No score.
areas_countedintegerAreas with data and a weight above 0.
areas_weightedintegerAreas with a weight above 0.
bandsobjecthealthy_from, needs_attention_from (the settings in use).
areasarray of objectkey (lifecycle, backups, compliance, service, alignment, security (2.6.1)), label, score (null = no data), weight, counted, details [{text, tone}] (null when the key can't read that area).
weakestobjectkey, score of the lowest counted area; null when none.
since_last_reviewobjectdate, score then, change, label (with meetings:read) of the newest completed business review; null when there is none or no score from then.
urlstring
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/health
GET/api/v1/clients/{id}/health/historyhealth:read

Get a client's health history

One entry per day that was recorded (once a day, and whenever the client is opened), newest first. Scores are worked out with the weights in use now.

ParameterType
daysintegerHow many days back, 1-1100 (default 90).
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of HealthDay

A client's health on one day (2.5.0).

FieldType
datedate
scoreintegerNull when no area had data.
bandstring
areasobjectlifecycle, backups, compliance, service, alignment, security (2.6.1): each 0-100 or null.
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/health/history

Alignment

GET/api/v1/alignment/standardsalignment:read

List the standards

The library alignment reviews measure clients against. Admins edit it in the web app (Libraries → Alignment standards).

ParameterType
include_inactivebooleanAlso standards switched off (kept for old reviews).
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of Standard

A standard in the alignment library (2.3.0).

FieldType
idinteger
categorystring
sectionstringOptional heading above the category.
titlestring
whystringWhy it matters, in the client's words.
howstringHow to check it (staff notes).
prioritystringcritical, high, medium, low.
weightintegerHow much it counts in the score: 4, 3, 2 or 1.
auto_checkstringos_supported, hw_lifecycle, warranty, stale, backups, or (2.6.1) a Microsoft 365 check: m365_secure_score, m365_mfa_users, m365_mfa_admins, m365_mfa_enforced, m365_legacy_blocked, m365_admin_count, m365_stale; or (2.6.3) a Google Workspace check: gws_mfa_users, gws_mfa_admins, gws_mfa_enforced, gws_admin_count, gws_stale, gws_external_sharing, gws_third_party_apps, gws_less_secure_apps; or an email authentication check: email_spf, email_dkim, email_dmarc; or (2.7.0) huntress_agents, huntress_incidents, huntress_av, huntress_identities, huntress_ports, sat_training, sat_phishing; null = answered by hand.
tagsarray of stringCompliance tags: answers are shared with compliance controls that have the same tags.
suggested_fixobjecttitle, category, cost: what Make project fills in.
activebooleanfalse = switched off (kept for old reviews).
updated_atdate-time
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/alignment/standards
GET/api/v1/clients/{id}/alignmentalignment:read

Get a client's alignment

The latest finished review's score and band, the change since the review before, the gaps (most important first, each with its roadmap project if one was made and the compliance controls it helps with) and the open draft.

Response: Alignment

A client's alignment with the standards (2.3.0).

FieldType
client_idinteger
scoreintegerPercent from the latest finished review; null = never reviewed (or nothing that applies).
bandstringOn track (80+), Needs attention (60-79), At risk (under 60), Not reviewed or No score.
reviewed_atdate-time
reviewed_bystring
review_idinteger
countsobjectaligned, misaligned, not_applicable, unanswered.
changeobjectpoints since the review before, since (its date); null with fewer than two reviews.
gapsarray of objectstandard_id, title, priority, category, note, why, helps_with (compliance controls), project {id, title, status, target_quarter} or null. Most important first.
not_applicablearray of objectstandard_id, title, note.
draftobjectid, started_at of the open draft; null when none.
urlstring
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/alignment
GET/api/v1/clients/{id}/alignment/reviewsalignment:read

List a client's reviews

ParameterType
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of AlignmentReview

An alignment review (2.3.0).

FieldType
idinteger
client_idinteger
statusstringdraft or done.
started_atdate-time
started_bystring
finished_atdate-time
finished_bystring
scoreintegerStored when finished.
bandstring
countsobjectaligned, misaligned, not_applicable, unanswered.
score_so_farintegerDrafts, with answers: the score if it were finished now.
answersarray of objectSingle review only: standard_id, category, title, priority, auto_check, answer (aligned, misaligned, na or null), note, updated_at. A draft lists every active standard.
urlstring
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/alignment/reviews
POST/api/v1/clients/{id}/alignment/reviewsalignment:write

Start a review

Starts from the last finished review's answers. If a draft is already open it is returned instead (200). Send an empty body.

Response: AlignmentReview

An alignment review (2.3.0).

FieldType
idinteger
client_idinteger
statusstringdraft or done.
started_atdate-time
started_bystring
finished_atdate-time
finished_bystring
scoreintegerStored when finished.
bandstring
countsobjectaligned, misaligned, not_applicable, unanswered.
score_so_farintegerDrafts, with answers: the score if it were finished now.
answersarray of objectSingle review only: standard_id, category, title, priority, auto_check, answer (aligned, misaligned, na or null), note, updated_at. A draft lists every active standard.
urlstring
curl -s -X POST -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/alignment/reviews
GET/api/v1/clients/{id}/alignment/reviews/{review}alignment:read

Get a review with its answers

Response: AlignmentReview

An alignment review (2.3.0).

FieldType
idinteger
client_idinteger
statusstringdraft or done.
started_atdate-time
started_bystring
finished_atdate-time
finished_bystring
scoreintegerStored when finished.
bandstring
countsobjectaligned, misaligned, not_applicable, unanswered.
score_so_farintegerDrafts, with answers: the score if it were finished now.
answersarray of objectSingle review only: standard_id, category, title, priority, auto_check, answer (aligned, misaligned, na or null), note, updated_at. A draft lists every active standard.
urlstring
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/alignment/reviews/<review>
DELETE/api/v1/clients/{id}/alignment/reviews/{review}alignment:write

Discard a draft

Finished reviews are kept: 409.

Returns 204 No Content.

curl -s -X DELETE -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/alignment/reviews/<review>
PATCH/api/v1/clients/{id}/alignment/reviews/{review}/answersalignment:write

Answer standards in a draft

Body (JSON): send only what changes

FieldType
answersarray of objectUp to 500 items: {"standard_id": 12, "answer": "aligned", "note": "..."}. answer is aligned, misaligned or na; a field left out stays as it is. All or nothing; 409 when the review is finished.
Response: AlignmentAnswersResult

Result of answering standards.

FieldType
updatedinteger
unchangedinteger
reviewobjectThe review afterwards (without answers).
curl -s -X PATCH -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" \
  -d '{"answers": [{"id": 101, "status": "met"}]}' \
  https://align.example.com/api/v1/clients/<id>/alignment/reviews/<review>/answers
POST/api/v1/clients/{id}/alignment/reviews/{review}/finishalignment:write

Finish a draft

Stores the score (weighted by priority; N/A and unanswered standards left out). 409 when it is already finished.

Response: AlignmentReview

An alignment review (2.3.0).

FieldType
idinteger
client_idinteger
statusstringdraft or done.
started_atdate-time
started_bystring
finished_atdate-time
finished_bystring
scoreintegerStored when finished.
bandstring
countsobjectaligned, misaligned, not_applicable, unanswered.
score_so_farintegerDrafts, with answers: the score if it were finished now.
answersarray of objectSingle review only: standard_id, category, title, priority, auto_check, answer (aligned, misaligned, na or null), note, updated_at. A draft lists every active standard.
urlstring
curl -s -X POST -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/alignment/reviews/<review>/finish

Backups

GET/api/v1/backupsbackups:read

Backup health for every client

ParameterType
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of BackupSummary

Backup health for one client.

FieldType
client_idinteger
client_namestring
healthstringok, warn, bad or muted.
jobsinteger
failed_jobsinteger
jobs_with_warningsinteger
protected_machinesinteger
overdueinteger
success_rate_30dinteger
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/backups
GET/api/v1/clients/{id}/backupsbackups:read

Get a client's backups

Stats, 30-day history, jobs (with the backup product's messages), protected machines, Microsoft 365 and servers with no backup. Includes machines backed up on your own server.

Response: ClientBackups

A client's backups.

FieldType
client_idinteger
healthstring
synced_atdate-time
stale_after_hoursinteger
statsobject
history_30darray of objectdate, result (success, warning, failed, none).
jobsarray of objectuid, name, kind, status, label, health, enabled, last_run, duration_seconds, message, target, size_bytes, hosted, shared_with_other_clients.
machinesarray of objectuid, name, kind, status, health, newest_restore_point, restore_points, backup_bytes, device_id, hosted, not_required.
servers_without_backuparray of objectdevice_id, name, type.
microsoft_365objecthealth, protected_objects, users, overdue, newest_restore_point, by_type, and objects: one per user, group, team or site (uid, name, type, health, newest_restore_point, restore_points, days_with_backup, counting_since, repositories, not_required, no_longer_backed_up: no new backup for longer than the "no longer backed up" days, old backups kept, health "retired", not counted). A mailbox kept in more than one repository is one object; days_with_backup counts each day with a restore point once, from counting_since.
urlstring
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/backups
GET/api/v1/clients/{id}/backup-exemptionsbackups:read

List items marked "backup not required"

ParameterType
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of Exemption

An item marked "backup not required".

FieldType
idinteger
client_idinteger
kindstringdevice, workload or m365.
device_idinteger
item_uidstring
namestring
reasonstring
created_atdate-time
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/backup-exemptions
POST/api/v1/clients/{id}/backup-exemptionsbackups:write

Mark an item "backup not required"

ParameterType
Idempotency-Key (header)stringSend a unique value to make retries safe: the same key within 24 hours returns the first response instead of creating a duplicate.

Body (JSON)

FieldType
kind requiredstring One of: device, workload, m365.
device_idintegerFor kind=device.
item_uidstringFor kind=workload or m365.
reason requiredstring Max 255 characters.
Response: Exemption

An item marked "backup not required".

FieldType
idinteger
client_idinteger
kindstringdevice, workload or m365.
device_idinteger
item_uidstring
namestring
reasonstring
created_atdate-time
curl -s -X POST -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" -H "Idempotency-Key: $(uuidgen)" \
  -d '{"kind": "device", "reason": "text"}' \
  https://align.example.com/api/v1/clients/<id>/backup-exemptions
DELETE/api/v1/clients/{id}/backup-exemptions/{exemption}backups:write

Remove a "not required" mark

Returns 204 No Content.

curl -s -X DELETE -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/backup-exemptions/<exemption>
GET/api/v1/backups/hostedbackups:read

Machines and jobs on your own backup server

meta.jobs lists the jobs. Needs a key for all clients.

ParameterType
showstringunmatched, sorted, ours or all (default).
pageintegerPage number (default 1).
per_pageintegerItems per page, 1-200 (default 50).
Response: a list of HostedMachine

A machine on your own backup server.

FieldType
uidstring
namestring
kindstringvm or computer.
newest_restore_pointdate-time
client_idinteger
client_namestring
matched_bystringdevice_name, job, manual or company.
statestringsorted, ours or unmatched.
assignmentstring"auto", "ours" or a client id set by hand.
device_idinteger
job_uidsarray of string
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/backups/hosted
PUT/api/v1/backups/hosted/machines/{uid}backups:write

Assign a hosted machine

uid from GET /backups/hosted, URL-encoded (vm:abc -> vm%3Aabc). Needs a key for all clients.

Body (JSON): send only what changes

FieldType
assignstringA client id (number), "ours" or "auto".
Response: HostedAssignment

Result of assigning a hosted machine or job.

FieldType
uidstring
namestring
client_idintegerMachines.
client_idsarray of integerJobs.
statestringMachines.
machinesintegerJobs.
curl -s -X PUT -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" \
  -d '{"assign": "text"}' \
  https://align.example.com/api/v1/backups/hosted/machines/<uid>
PUT/api/v1/backups/hosted/jobs/{uid}backups:write

Assign a hosted job (and its machines)

Needs a key for all clients.

Body (JSON): send only what changes

FieldType
assignstringA client id (number), "ours" or "auto".
Response: HostedAssignment

Result of assigning a hosted machine or job.

FieldType
uidstring
namestring
client_idintegerMachines.
client_idsarray of integerJobs.
statestringMachines.
machinesintegerJobs.
curl -s -X PUT -H "Authorization: Bearer $ALIGN_KEY" -H "Content-Type: application/json" \
  -d '{"assign": "text"}' \
  https://align.example.com/api/v1/backups/hosted/jobs/<uid>

Service levels

GET/api/v1/clients/{id}/service-levelsservice:read

Get a client's SLA results

ParameterType
periodstringDays (30, 90, 180, 365) or a named period as on the Service levels page. Default 90.
missed_limitintegerHow many missed tickets to list (max 100, default 25).
Response: ServiceLevels

SLA results for a period.

FieldType
client_idinteger
periodstring
labelstring
goal_pctnumber
has_slaboolean
synced_atdate-timeLast ticket sync.
statsobjecttickets, responded_on_time_pct, resolved_on_time_pct, response_met/missed, resolution_met/missed, avg_first_response_minutes.
previous_periodobjectSame shape.
openobjecttotal, past_target, close_to_target.
monthlyarray of objectLast 12 months, oldest first: month (YYYY-MM) plus the stats fields.
by_priorityarray of object
missed_ticketsarray of objectnumber, opened, priority, subject, missed_response, missed_resolution.
urlstring
curl -s -H "Authorization: Bearer $ALIGN_KEY" \
  https://align.example.com/api/v1/clients/<id>/service-levels