# AccuLynx API and MCP server

> Yes, but only with the AppConnections add-on: AccuLynx has a REST API (v2) for jobs, contacts, estimates, photos, job messages and payments, and an administrator creates the API key for each location (checked 11 Oct 2026). The API reads milestones but cannot change them, it cannot create estimates, and there is no official AccuLynx MCP server.

Roofing contractor software: leads and jobs moving through milestones, contacts, estimates, job photos, job messages and payments.

## What is the AccuLynx API?

Cotlet's AccuLynx API exposes 14 endpoints for your own AccuLynx account: list jobs, get job, find contact, list estimates, get estimate, list job messages, list job payments, create contact, create job, update job milestone, upload job photo, post job message, add contact note and record payment received. The list_jobs endpoint returns jobs in your location with name, address, current milestone, priority and dates. Each endpoint takes simple JSON inputs like job_id, milestone or limit and works both as an MCP tool for agents and as a REST call for scripts.

- **Category:** [Local services & SaaS](https://cotlet.dev/integrations/category/local-services-saas)
- **Endpoints:** 14 (7 read, 7 write)
- **Updated:** 2026-10-11

Yes, but only with the AppConnections add-on: AccuLynx has a REST API (v2) for jobs, contacts, estimates, photos, job messages and payments, and an administrator creates the API key for each location (checked 11 Oct 2026). Cotlet is a hosted MCP server and REST API for AccuLynx with 14 endpoints (7 read, 7 write): your AI agent signs in as you and does the work.

## Does AccuLynx have an official API?

Yes, but only with the AppConnections add-on: AccuLynx has a REST API (v2) for jobs, contacts, estimates, photos, job messages and payments, and an administrator creates the API key for each location (checked 11 Oct 2026). The API reads milestones but cannot change them, it cannot create estimates, and there is no official AccuLynx MCP server.

| Task | AccuLynx official | Cotlet |
|---|---|---|
| Find jobs by milestone | Partly: Needs the AppConnections add-on | Yes |
| Add a contact and open a job for it | Partly: Needs the add-on; the contact must exist before the job | Yes |
| Move a job to another milestone | No: Milestones are read only in the API | Yes |
| Upload job photos | Partly: Needs the add-on | Yes |
| Post a job message | Partly: Needs the add-on | Yes |
| Read estimates and their line items | Partly: Needs the add-on; read only, no creating estimates | Yes |
| Record a payment received | Partly: Needs the add-on | Yes |
| Add a note to a contact | Partly: Needs the add-on | Yes |

Sources: [AccuLynx AppConnections](https://acculynx.com/appconnections/), [AccuLynx API docs: authentication](https://apidocs.acculynx.com/docs/authentication), [AccuLynx API docs: reference](https://apidocs.acculynx.com/reference), [AccuLynx on Zapier MCP](https://zapier.com/mcp/acculynx), [AccuLynx: Create automations in AccuLynx](https://acculynx.com/create-automations-in-acculynx-to-save-you-hours-every-week/), [AccuLynx API docs: Create Job](https://apidocs.acculynx.com/reference/createjob)

## For AI agents

```text
Yes, but only with the AppConnections add-on: AccuLynx has a REST API (v2) for jobs, contacts, estimates, photos, job messages and payments, and an administrator creates the API key for each location (checked 11 Oct 2026). The API reads milestones but cannot change them, it cannot create estimates, and there is no official AccuLynx MCP server.
Cotlet provides a hosted MCP server and REST API for AccuLynx: 14 tools (7 read, 7 write).
Access       Request access at https://cotlet.dev/app/signup?app=acculynx; we email the API key.

MCP server   https://cotlet.dev/mcp/v1
REST base    https://cotlet.dev/api/v1/acculynx
Auth         Authorization: Bearer <COTLET_API_KEY>. Listing endpoints and schemas needs no key; calling an endpoint needs one.
Tools        list_jobs, get_job, find_contact, list_estimates, get_estimate, list_job_messages, list_job_payments, create_contact, create_job, update_job_milestone, upload_job_photo, post_job_message, add_contact_note, record_payment_received
Confirm      update_job_milestone, post_job_message, record_payment_received (by default the user approves each call; the user can switch this off per tool, e.g. for scheduled automations)
Markdown     https://cotlet.dev/integrations/acculynx-api-mcp-server.md

How access works:
1. The user requests access at https://cotlet.dev/app/signup?app=acculynx (AccuLynx is pre-selected). Each request is reviewed and the API key is sent by email.
2. The user signs in to AccuLynx once in a browser. An agent cannot do this step.
3. The API key goes into the MCP client or the REST call as a bearer token.

Fits: people who want a hosted AccuLynx server that someone else maintains, including non-developers.

Policy: Cotlet never stores passwords, never solves CAPTCHAs, never bypasses MFA.
Company: legal details in the Terms of service at https://cotlet.dev/terms. Contact contact@cotlet.dev.
Session: the user signs in to AccuLynx in a browser; Cotlet keeps only the session, AES-256 encrypted, revocable in the dashboard at any time.
Terms: the user stays responsible for following AccuLynx's terms; Cotlet is not affiliated with AccuLynx.
```

## What can an AI agent do in AccuLynx?

Cotlet is best for roofing contractors and their office staff who want an AI agent to add leads, upload job photos, move milestones and check estimates without running or fixing a server.

- **[Create jobs from new leads](https://cotlet.dev/integrations/acculynx-api-mcp-server/create-jobs-from-new-leads)**: "New lead from the website form: Jane Doe, (214) 555-0142, jane.doe@example.com, 12 Oak St, Plano, roof leaking since Sunday's storm, came from Google Ads. Check she is not already in AccuLynx, add her and open a job." → `find_contact`, `create_contact`, `create_job`, `add_contact_note`
- **Upload inspection photos to a job**: "Upload the 14 photos in ./inspection to the Oak St job and leave a message for the crew." → `list_jobs`, `upload_job_photo`, `post_job_message`
- **[Find stalled jobs and their estimates](https://cotlet.dev/integrations/acculynx-api-mcp-server/find-stalled-jobs)** (runs: weekly): "Every Monday, list Prospect jobs that have sat there more than 21 days with their estimate totals and the last job message, plus Completed jobs older than 7 days that still have money owed." → `list_jobs`, `get_job`, `list_estimates`, `list_job_messages`
- **[Move a signed job to Approved](https://cotlet.dev/integrations/acculynx-api-mcp-server/move-job-to-next-milestone)**: "The Miller job at 48 Pine Ridge Rd signed today. Move it to Approved and log the $2,500 deposit, check #2218 dated Oct 10." → `list_jobs`, `get_job`, `update_job_milestone`, `list_job_payments`, `record_payment_received`
- **List completed jobs not yet invoiced** (runs: weekly): "Every Monday, list jobs that reached Completed last week but are not Invoiced." → `list_jobs`, `get_job`

## Can AccuLynx automations run on a schedule in n8n, Make or Zapier?

Yes. Cotlet does not replace your automation platform: it gives it a AccuLynx connection it does not have, with the same API key as your agent. Write actions ask for your OK by default; switch that off in your dashboard for the tools you choose, for example to find stalled jobs and their estimates, and the schedule runs on its own. Cotlet runs in the cloud, so it keeps going while your computer is off.

| Where | How to connect | How to schedule |
|---|---|---|
| Your AI agent | Add https://cotlet.dev/mcp/v1 with your API key. | A scheduled agent run, for example a Claude Code routine. |
| n8n | MCP Client node with https://cotlet.dev/mcp/v1, or an HTTP Request node to https://cotlet.dev/api/v1/acculynx/{tool}. | Schedule Trigger node. |
| Make | HTTP module: POST https://cotlet.dev/api/v1/acculynx/{tool} with an Authorization: Bearer header and a JSON body. | Scenario schedule. |
| Zapier | Webhooks by Zapier: POST https://cotlet.dev/api/v1/acculynx/{tool} with the same header and body. | Schedule by Zapier trigger. |
| Your own script | POST https://cotlet.dev/api/v1/acculynx/{tool} with your API key. | cron or GitHub Actions. |

## Tools

**For AI agents:** Every endpoint and its schema is public. The 14 endpoints on this page, with parameters and example responses, can be listed without an account. Calling one returns 403 until the account has an API key with access to AccuLynx.

### list_jobs

Jobs in your location with name, address, current milestone, priority and dates. Access: read. REST: `POST /api/v1/acculynx/list_jobs`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `milestone` | enum | no | Lead, Prospect, Approved, Completed, Invoiced, Closed or Dead. Default: all. |
| `search` | string | no | Job name, address or contact name. |
| `sort_by` | enum | no | created, milestone_date or modified. Default: modified. |
| `limit` | integer | no | 1 to 100. Default: 25. |
| `cursor` | string | no | Next page cursor from the previous call. |

Lists jobs in one location, most recently modified first unless you sort otherwise. Filter by milestone or search by job name, address or contact name. Milestone is one of Lead, Prospect, Approved, Completed, Invoiced, Closed or Dead. Pages hold up to 100 jobs; pass next_cursor back as cursor for the next page.

Example response:

```json
{
  "jobs": [
    {
      "job_id": "b3f1c2a4-7d2e-4f0a-9c51-2e8a4d6f1b90",
      "job_name": "Miller - 48 Pine Ridge Rd",
      "address": "48 Pine Ridge Rd, Plano, TX 75074",
      "milestone": "Prospect",
      "priority": "Normal",
      "milestone_date": "2026-09-02T10:20:00-05:00",
      "modified_at": "2026-10-08T15:41:00-05:00"
    },
    {
      "job_id": "e91a47d3-5c60-4b2f-8d1e-0a7f3c9b5e24",
      "job_name": "Garcia - 310 Elm Ct",
      "address": "310 Elm Ct, Frisco, TX 75034",
      "milestone": "Prospect",
      "priority": "High",
      "milestone_date": "2026-09-11T08:05:00-05:00",
      "modified_at": "2026-10-06T09:12:00-05:00"
    }
  ],
  "next_cursor": null
}
```

### get_job

Full job: contacts, address, trade and work type, milestone history, sales owner and financial totals. Access: read. REST: `POST /api/v1/acculynx/get_job`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |

Returns one job with its contacts, job site address, trade and work type, sales owner and the milestone history in order. Financial totals are the figures shown on the job in AccuLynx. Use the job_id from list_jobs.

Example response:

```json
{
  "job_id": "e91a47d3-5c60-4b2f-8d1e-0a7f3c9b5e24",
  "job_name": "Garcia - 310 Elm Ct",
  "address": "310 Elm Ct, Frisco, TX 75034",
  "milestone": "Completed",
  "priority": "Normal",
  "work_type": "Replacement",
  "trade_types": [
    "Roofing"
  ],
  "sales_owner": "Dana Whitfield",
  "contacts": [
    {
      "contact_id": "c2b8f6a1-90d4-4a37-b5e2-6f1d8a3c7e09",
      "name": "Luis Garcia",
      "role": "Primary"
    }
  ],
  "milestone_history": [
    {
      "milestone": "Lead",
      "date": "2026-08-14T11:02:00-05:00"
    },
    {
      "milestone": "Prospect",
      "date": "2026-08-16T09:30:00-05:00"
    },
    {
      "milestone": "Approved",
      "date": "2026-09-11T08:05:00-05:00"
    },
    {
      "milestone": "Completed",
      "date": "2026-10-05T16:48:00-05:00"
    }
  ],
  "totals": {
    "contract": "14850.00",
    "received": "7425.00",
    "currency": "USD"
  }
}
```

### find_contact

Contacts matching a name, email or phone number, with their jobs. Access: read. REST: `POST /api/v1/acculynx/find_contact`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `query` | string | yes | Name, email or phone. |

Searches contacts by name, email or phone number and returns each match with the jobs linked to it. Run it before create_contact so you do not add the same person twice. Use the contact_id with create_job and add_contact_note.

Example response:

```json
{
  "contacts": [
    {
      "contact_id": "c7d2a9f0-3b11-4e8c-a6d5-91f0e2b47c18",
      "name": "Jane Doe",
      "phone": "(214) 555-0142",
      "email": "jane.doe@example.com",
      "jobs": []
    }
  ]
}
```

### list_estimates

Estimates on a job with name, total and date. Access: read. REST: `POST /api/v1/acculynx/list_estimates`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |

Returns every estimate on one job with its name, total and date. Pass estimate_id to get_estimate for the sections and line items. Estimates are read only: Cotlet does not create or edit them.

Example response:

```json
{
  "estimates": [
    {
      "estimate_id": "a40d9e17-2f6b-4c83-b1a5-7e3c8d0f6291",
      "name": "Full replacement, architectural shingles",
      "total": "14850.00",
      "date": "2026-09-09"
    }
  ]
}
```

### get_estimate

One estimate with its sections, line items, quantities and prices. Access: read. REST: `POST /api/v1/acculynx/get_estimate`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `estimate_id` | string | yes | Estimate ID from list_estimates. |

Returns one estimate with its sections in order and the line items in each section, with quantity and price. Line item totals add up to the estimate total. Use it to read back what was promised on a job.

Example response:

```json
{
  "estimate_id": "a40d9e17-2f6b-4c83-b1a5-7e3c8d0f6291",
  "name": "Full replacement, architectural shingles",
  "total": "14850.00",
  "sections": [
    {
      "name": "Materials",
      "items": [
        {
          "name": "Architectural shingles",
          "quantity": 32,
          "unit": "square",
          "price": "210.00",
          "total": "6720.00"
        }
      ]
    },
    {
      "name": "Labor",
      "items": [
        {
          "name": "Tear-off and install",
          "quantity": 32,
          "unit": "square",
          "price": "253.13",
          "total": "8100.00"
        },
        {
          "name": "Dumpster",
          "quantity": 1,
          "unit": "each",
          "price": "30.00",
          "total": "30.00"
        }
      ]
    }
  ]
}
```

### list_job_messages

Messages posted on a job, with author, date and replies. Access: read. REST: `POST /api/v1/acculynx/list_job_messages`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `limit` | integer | no | 1 to 100. Default: 25. |

Returns the messages on one job, newest first, with replies nested under the message they answer. Use it to read what the crew and office said before you post.

Example response:

```json
{
  "messages": [
    {
      "message_id": "m-3a91",
      "author": "Dana Whitfield",
      "body": "Customer wants the ridge vent upgrade.",
      "posted_at": "2026-10-04T14:10:00-05:00",
      "replies": [
        {
          "message_id": "m-3a97",
          "author": "Crew lead",
          "body": "Added to the order.",
          "posted_at": "2026-10-04T15:02:00-05:00"
        }
      ]
    }
  ]
}
```

### list_job_payments

Payments recorded on a job with date, method and amount. Access: read. REST: `POST /api/v1/acculynx/list_job_payments`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |

Returns the payments recorded on one job, newest first, with the method and reference. Use it before record_payment_received to see whether a deposit is already there.

Example response:

```json
{
  "payments": [
    {
      "payment_id": "p-1182",
      "type": "received",
      "amount": "7425.00",
      "method": "Check",
      "reference": "#1043",
      "received_on": "2026-09-12"
    }
  ]
}
```

### create_contact

New contact with name, phone, email and mailing address. Access: write. REST: `POST /api/v1/acculynx/create_contact`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `first_name` | string | yes | First name. |
| `last_name` | string | yes | Last name. |
| `phone` | string | no | Phone number. |
| `email` | string | no | Email address. |
| `address` | object | no | street, city, state, zip. |

Adds one contact to AccuLynx and returns its contact_id. It adds a record your team sees and sends nothing to the person, so it runs without asking. Use find_contact first to avoid duplicates.

Example response:

```json
{
  "contact_id": "c7d2a9f0-3b11-4e8c-a6d5-91f0e2b47c18",
  "name": "Jane Doe",
  "phone": "(214) 555-0142",
  "email": "jane.doe@example.com",
  "created_at": "2026-10-11T09:02:00-05:00"
}
```

### create_job

New job for a contact, at the job site address. Access: write. REST: `POST /api/v1/acculynx/create_job`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `contact_id` | string | yes | Contact ID from find_contact or create_contact. |
| `job_name` | string | no | Default: contact name and street. |
| `address` | object | no | Job site: street, city, state, zip. Default: contact address. |
| `priority` | enum | no | Normal, High or Urgent. Default: Normal. |

Opens a job for an existing contact and returns it with the milestone it starts in. The job site address defaults to the contact address. It adds a record your team sees and sends nothing to the customer, so it runs without asking.

Example response:

```json
{
  "job_id": "f2a6c8d1-4e93-4b07-a1d5-3c9e7b0f5a62",
  "job_name": "Doe - 12 Oak St",
  "address": "12 Oak St, Plano, TX 75074",
  "milestone": "Lead",
  "priority": "High",
  "created_at": "2026-10-11T09:03:00-05:00"
}
```

### update_job_milestone

Move a job to another milestone, as you would in the job file, if your role allows it. Access: write, asks the user first. REST: `POST /api/v1/acculynx/update_job_milestone`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `milestone` | enum | yes | Prospect, Approved, Completed, Invoiced, Closed or Dead. |

Moves one job to another milestone the way you do in the job file, and returns the previous milestone and the date of the new one. It fails if your AccuLynx role does not allow the move. A milestone change can set off your own AccuLynx workflow. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "job_id": "b3f1c2a4-7d2e-4f0a-9c51-2e8a4d6f1b90",
  "job_name": "Miller - 48 Pine Ridge Rd",
  "milestone": "Approved",
  "previous_milestone": "Prospect",
  "milestone_date": "2026-10-12T09:14:00-05:00"
}
```

### upload_job_photo

Add a photo or video to the job file, with an optional tag and description. Access: write. REST: `POST /api/v1/acculynx/upload_job_photo`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `file_url` | string | yes | Image or video URL, or a file sent with the REST call. |
| `tag` | string | no | One of your company photo and video tags. |
| `description` | string | no | Caption shown with the photo. |

Adds one photo or video to the job file and returns its ID. The tag must be one of your company photo and video tags. The file goes into the job and nothing is sent to anyone, so it runs without asking.

Example response:

```json
{
  "photo_id": "ph-5530",
  "job_id": "b3f1c2a4-7d2e-4f0a-9c51-2e8a4d6f1b90",
  "tag": "Inspection",
  "description": "North slope, ridge cap damage",
  "uploaded_at": "2026-10-11T10:21:00-05:00"
}
```

### post_job_message

Post a message on a job for your team, or reply in a thread. Access: write, asks the user first. REST: `POST /api/v1/acculynx/post_job_message`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `body` | string | yes | Message text. |
| `reply_to_id` | string | no | Message ID from list_job_messages to reply to. |

Posts a message on one job under your name, or a reply under an existing message when reply_to_id is set. Your team sees it on the job. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "message_id": "m-3b02",
  "job_id": "b3f1c2a4-7d2e-4f0a-9c51-2e8a4d6f1b90",
  "reply_to_id": null,
  "status": "posted",
  "posted_at": "2026-10-11T10:24:00-05:00"
}
```

### add_contact_note

Add a note to a contact record. Access: write. REST: `POST /api/v1/acculynx/add_contact_note`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `contact_id` | string | yes | Contact ID from find_contact or create_contact. |
| `body` | string | yes | Note text. |

Adds a note to one contact record and returns its ID. The note shows on the contact in AccuLynx and is sent to no one, so it runs without asking.

Example response:

```json
{
  "note_id": "n-7741",
  "contact_id": "c7d2a9f0-3b11-4e8c-a6d5-91f0e2b47c18",
  "status": "added",
  "created_at": "2026-10-11T09:05:00-05:00"
}
```

### record_payment_received

Record a payment the customer made on a job. Nothing is charged. Access: write, asks the user first. REST: `POST /api/v1/acculynx/record_payment_received`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `amount` | string | yes | Amount, e.g. "2500.00". |
| `method` | string | yes | Payment method as named in your AccuLynx account, e.g. Check. |
| `received_on` | date | no | Default: today. |
| `reference` | string | no | Check number or memo. |

Records a payment the customer already made on one job, for example a deposit check, and returns the payment. Nothing is charged: it only writes the payment into the job. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "payment_id": "p-1183",
  "job_id": "b3f1c2a4-7d2e-4f0a-9c51-2e8a4d6f1b90",
  "amount": "2500.00",
  "method": "Check",
  "reference": "#2218",
  "received_on": "2026-10-12",
  "status": "recorded"
}
```

## How do I connect AccuLynx to Claude Code, Codex or Cursor?

Connecting AccuLynx takes three steps: request access, sign in to AccuLynx once, then add one MCP server or call the REST API with the same key.

### Connect AccuLynx to your agent.

1. **Create an account** Sign up and add AccuLynx in the console. Your API key is there too.

2. **Sign in to AccuLynx once** Open the connect page from the console and sign in to AccuLynx the way you always do. We keep the session, never your password, and you can revoke it anytime.

3. **Add Cotlet to your agent** Paste the snippet for your client. The same server and key serve every app you connect, so you do this once.

   Claude Code:

```
claude mcp add --transport http cotlet \
  https://cotlet.dev/mcp/v1 \
  --header "Authorization: Bearer $COTLET_API_KEY"
```

   Cursor:

```
{
  "mcpServers": {
    "cotlet": {
      "url": "https://cotlet.dev/mcp/v1",
      "headers": {
        "Authorization": "Bearer ${COTLET_API_KEY}"
      }
    }
  }
}
```

   Codex:

```
# ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY"
```

4. **Ask your agent** Ask in plain words. Your agent finds the AccuLynx tools on the server and calls them for you; anything that reaches other people waits for your OK unless you switch that off for a tool.

```
New lead from the website form: Jane Doe, (214) 555-0142, jane.doe@example.com, 12 Oak St, Plano, roof leaking since Sunday's storm, came from Google Ads. Check she is not already in AccuLynx, add her and open a job.
```

### Call AccuLynx from your scripts.

1. **Export your API key** Your scripts use the same API key as your agent. Keep it in an environment variable, never in your code.

```
export COTLET_API_KEY="cotlet_..."
```

2. **Call a tool** Every tool is a POST endpoint at /api/v1/acculynx/{tool}. Send its parameters as JSON, exactly as listed in the endpoints above.

```
curl https://cotlet.dev/api/v1/acculynx/update_job_milestone \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"job_id":"b3f1c2a4-7d2e-4f0a-9c51-2e8a4d6f1b90","milestone":"Approved"}'
```

3. **Read the result** You get plain JSON back, ready for your script. A failed call costs nothing.

```
{
  "job_id": "b3f1c2a4-7d2e-4f0a-9c51-2e8a4d6f1b90",
  "job_name": "Miller - 48 Pine Ridge Rd",
  "milestone": "Approved",
  "previous_milestone": "Prospect",
  "milestone_date": "2026-10-12T09:14:00-05:00"
}
```

## Why use Cotlet for AccuLynx?

**Built for agents**

- One MCP server for every app you connect.
- The same tools as a REST API for scripts and cron jobs.
- Works with Claude Code, Codex and Cursor.

**Your login stays yours**

- You sign in to AccuLynx yourself. We keep only the session, encrypted with AES-256.
- The model never sees a login.
- No stored passwords, no CAPTCHA solving, no MFA bypass.

**You stay in control**

- Pick read only, or read and write.
- Anything that reaches other people waits for your OK, unless you switch it off per tool.
- Revoke access in one click.

**Kept working for you**

- We test every integration daily.
- When AccuLynx changes, the tool pauses until we fix it.
- Failed calls cost nothing.

## Is there a AccuLynx MCP server on GitHub?

Zapier has an AccuLynx app, also through Zapier MCP. It has triggers on jobs, contacts and milestone changes, and actions that create contacts, jobs and leads and set custom fields. It runs on the same AppConnections API key, so it cannot move a job to another milestone.

|  | Zapier | Cotlet |
|---|---|---|
| Setup | Zapier account, AppConnections add-on and an API key from an AccuLynx administrator | Request access, sign in to AccuLynx once in your browser, add one MCP server or API key |
| Write actions | Create contact, job or lead, update custom fields, set the initial appointment | Also move milestones, upload photos, post job messages, add contact notes and record payments |
| Milestones | Triggers when a milestone changes, cannot change it | Moves a job to another milestone, as your role allows in the app |
| When AccuLynx changes | Zapier updates its app; fields the API lacks stay out of reach | Our team tests it daily and fixes it for you; failed calls are free |
| Your AccuLynx access | An API key with access to one location | Your session, encrypted in an EU vault, revoked in one click |
| Where it runs | Zapier cloud: Zaps or Zapier MCP | Hosted: Claude Code, Codex, Cursor, n8n and scripts, also on a schedule |
| Price | Your Zapier plan, each action counts as a task | Free 7-day trial with 5,000 credits, then credits per call |

### Which one fits you

**Pick Cotlet if**

- you are not a developer, or you do not want to maintain a server
- you need it to keep working when AccuLynx changes, without checking it yourself
- your agent or a script should run it on a schedule, also while your computer is off

**Pick an open-source server if**

- you are comfortable installing, updating and fixing it yourself
- you want the session to stay on your own computer
- you only need it now and then, from one MCP client

## How much does the AccuLynx API cost?

Free 7-day trial with 5,000 credits, no card needed. After that, the AccuLynx API comes with the Cotlet plan, from $29 a month for 3,000 credits, with no limit on apps. Each month's credits stay valid for 3 months, so unused credits add up.

| Size | Price | Credits / month | Per credit |
|---|---|---|---|
| Solo | $29/mo | 3,000 | about $0.0097 |
| Pro | $99/mo | 12,000 | about $0.0083 |
| Agency | $299/mo | 40,000 | $0.0075 |

Each successful call uses credits for the work it takes; failed calls and timeouts cost nothing. A hard spend cap is on by default. Authenticate with the `Authorization: Bearer` header. [See full pricing](https://cotlet.dev/pricing)

## How Cotlet holds your access

Cotlet hosts MCP servers and REST APIs for apps with no usable API. Your agent works in your own AccuLynx account.

- **Company details:** The legal name, address and registration numbers of the company behind Cotlet are in the Terms of service. [Terms](https://cotlet.dev/terms)
- **Your session:** You sign in to AccuLynx yourself, in your browser. We keep only the session, never your password: encrypted with AES-256 in an EU vault, isolated to your account and used only when your agent calls a AccuLynx tool you allowed. When it expires, your agent gives you a link to sign in again. [Security](https://cotlet.dev/security)
- **Revoking access:** Disconnect AccuLynx in your dashboard: the session is deleted and access ends at once. Actions that reach other people wait for your OK unless you switch that off per tool.
- **What we never do:** Store passwords, solve CAPTCHAs or bypass MFA.
- **AccuLynx's terms:** You use your own AccuLynx account and stay responsible for following AccuLynx's terms. Cotlet is independent and not affiliated with AccuLynx. [Terms](https://cotlet.dev/terms)
- **Contact:** Questions about the company, security or an app: [contact@cotlet.dev](mailto:contact@cotlet.dev)

## Frequently asked questions

**How do I get access?**

Request access and pick AccuLynx. Cotlet reviews each request and emails you your API key.

**Do I need to be technical?**

No. You sign in to AccuLynx once in your browser and paste one command into your agent, or one URL into n8n. Your agent can walk you through it. There is no server to install, update or fix.

**Is a hosted server safe? My AccuLynx session would leave my computer.**

Cotlet keeps your AccuLynx session encrypted with AES-256 in an EU vault, isolated to your account and used only for the tools you allow: read only, or read and write. The AI model never sees it, and you revoke it in one click. A local server keeps the same session in a file on your computer, readable by any program you run, and needs a fresh sign-in whenever it expires.

**Do I need the AppConnections add-on?**

No. Cotlet works in your own AccuLynx account and does not use an API key, which AccuLynx gives only with the AppConnections add-on (checked 11 Oct 2026). What the tools can do depends on your AccuLynx role.

**Can it create or edit estimates?**

No. list_estimates and get_estimate only read. AccuLynx's own API also has read-only estimate endpoints.

**Can my agent post or send messages in AccuLynx without asking me?**

No. Every call to update_job_milestone, post_job_message or record_payment_received waits for your OK by default. For scheduled automations you can switch confirmation off per tool in your dashboard, for example only for approvals. create_contact, create_job, upload_job_photo, add_contact_note runs without asking, because it sends nothing to anyone and one call undoes it.

**Can I use the AccuLynx API in n8n?**

Yes. Add https://cotlet.dev/mcp/v1 with your API key in n8n's MCP Client node, or call https://cotlet.dev/api/v1/acculynx/{tool} from the HTTP Request node.
