REST API for RISE CRM

Connect anything to your RISE CRM. Read and write your clients, leads, invoices, projects, tasks and tickets over a clean HTTP/JSON API - or let AI agents and automation platforms do it for you.

Browse the API Get the plugin

Endpoints
322
Groups
54
Writable resources
43
MCP tools
200+
🚀 Fastest way to start: import the ready-made Postman collection your own installation serves at GET /api/postman.json - one folder per API group, with {{base_url}} already filled in. Paste your token into the collection's authtoken variable and you are calling the API in minutes. Prefer to click around? GET /api/playground opens an interactive playground and GET /api/swagger renders Swagger UI.

👋 Welcome

This is the complete reference for the RISE CRM REST API - and it is friendlier than it looks. If you have ever sent an HTTP request, you already know enough to get started.

Everything runs over plain HTTP/HTTPS and speaks JSON, using the standard verbs (GET, POST, PUT, PATCH, DELETE) and standard HTTP status codes. Every endpoint lives under your installation's base URL:

https://yoursite.com/index.php/api/

If your installation serves URLs without index.php, the same endpoints answer at https://yoursite.com/api/.

🔑 Authentication

Send your token with every request, in the authtoken HTTP header:

authtoken: YOUR_API_TOKEN

A missing, unknown or expired token is answered with a JSON error, and an unknown path answers { "status": false, "code": 404, "message": "Route not found" }.

👨‍💻 Installation

  1. Go to Settings > Plugins > Install plugin.
  2. Drag and drop the plugin zip (upload.zip), enter your license key, and press Install.
  3. Open the actions menu on the API plugin row and select Activate.

✏️ Create an API token

  1. Sign in to your RISE CRM admin area as an administrator.
  2. Open API in the left sidebar to reach the API management screen.
  3. Create your first API user and copy the generated token - it is needed in every call.

📄 Request bodies

Every writable resource accepts both PUT and PATCH. Accepted formats depend on the verb:

  • POST - JSON, x-www-form-urlencoded or multipart/form-data.
  • PUT / PATCH - JSON or x-www-form-urlencoded (no multipart).

Updates are partial: only the fields present in your body are written, and every column you leave out keeps its current value.

🔎 Search endpoints

Most resources expose a dedicated /search/{keyword} endpoint - including the read-only ones such as Activity Logs, Roles and Templates. Line items and custom fields are the exceptions: they are addressed through their parent record instead. Search is deliberately capped: it returns at most 10 matches.

Treat it as a fast "turn this name into an id" lookup, not a way to page through data - use the resource's list endpoint when you need the full set.

🚀 What's new in v2.1.0

🤖 MCP server for AI agents

POST /api/mcp speaks the Model Context Protocol (JSON-RPC 2.0, 2024-11-05) and exposes 200+ permission-filtered tools to Claude Desktop, ChatGPT, Cursor and the n8n AI Agent - list, get, search, create, update and delete for every writable resource, plus lookup catalogues. Opt-in: disabled until an administrator switches it on. Call tools/list for the exact set your token can see.

🪝 Webhooks

created, updated and deleted for every writable resource, managed over REST, queued and drained by cron, HMAC-SHA256 signed (X-Rise-Signature), with delivery logs and SSRF protection. GET /api/webhooks/events returns the authoritative catalogue for your installation.

⚡ Batch operations

POST /api/batch runs up to 50 operations in one request, using the same tool names as the MCP surface, with per-item results.

🔌 Automation platforms

Ready-made polling triggers for n8n, Zapier and Make under /api/automation/* - list, sample and poll.

📊 Reporting

Four read-only aggregates - summary, invoices, projects and timesheets - plus GET /api/reports, the catalogue that lists them. A dashboard makes one request per panel.

⚛ Custom Fields

Read the custom field definitions and read or write the values stored on any individual record.

🧾 Machine-readable specs

GET /api/openapi.json (OpenAPI 3.0), /api/postman.json (Postman v2.1), /api/swagger and /api/playground.

📇 A wider resource surface

34 CRM resources with full CRUD and search - proposals, orders, contracts, subscriptions, milestones, comments, timesheets and more - plus line items, knowledge base, checklists and files.

📇 Sample request

List all clients of your RISE CRM installation with a single cURL call:

curl -H "authtoken: YOUR_API_TOKEN" https://yoursite.com/index.php/api/clients

Fetch a single record by id, or find one by keyword:

curl -H "authtoken: YOUR_API_TOKEN" https://yoursite.com/index.php/api/clients/2
curl -H "authtoken: YOUR_API_TOKEN" https://yoursite.com/index.php/api/clients/search/jdoe

MCP

MCP Server Transport Info

GET/api/mcp

The MCP endpoint only accepts POST. Server-Sent Events streaming is not offered, so a GET request answers with the JSON-RPC "method not found" error telling the client to POST its JSON-RPC 2.0 payloads instead.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/mcp" \
  -H "authtoken: YOUR_API_TOKEN"

Response:

HTTP/1.1 405 Method Not Allowed
{
  "jsonrpc": "2.0",
  "error": {
    "code": -32601,
    "message": "Use POST with JSON-RPC 2.0 payloads; SSE streaming is not offered."
  },
  "id": null
}

MCP Server (AI Agents)

POST/api/mcp

Model Context Protocol server over Streamable HTTP (JSON-RPC 2.0). Exposes the whole RISE CRM REST surface - list, get, search, create, update and delete tools across 41 resources plus lookup catalogues and utilities - to Claude Desktop, ChatGPT, Cursor, n8n AI Agent and any other MCP client.

Three capabilities are advertised by initialize: tools (tools/list, tools/call), resources (resources/list, resources/templates/list, resources/read) and prompts (prompts/list, prompts/get). ping is supported too.

Line items. The six line item tables are ordinary resources (invoice_items, estimate_items, proposal_items, order_items, contract_items, subscription_items), and each document type also has a composite tool - invoices_create_with_items, estimates_create_with_items, proposals_create_with_items, orders_create_with_items, contracts_create_with_items, subscriptions_create_with_items - that validates the lines, writes the header, then its lines, then recalculates the document totals in one call. The whole composite call runs in a single database transaction, so a rejected line rolls the header back with it and never leaves a document with missing lines.

Context resources. resources/read returns a per-record document under a rise:// URI, for example rise://clients/12 or rise://invoices/48, with the record and the collections that belong to it (contacts, projects, line items, payments, tasks, comments). rise://catalogue/lookups resolves every RISE picker in one read, and rise://server/info describes the server.

Prompts. prompts/list returns canned prompts - summarise a client, draft a follow-up for a lead, explain an invoice, report on a project, triage open tickets, review the pipeline - and prompts/get renders one with the record it is about already attached as an embedded resource.

Payload size. tools/list answers with the whole catalogue in one page when no cursor is sent, which is what MCP clients expect. A client that wants pages opts in by sending cursor ("0" starts at the beginning) and then follows nextCursor. An administrator can shrink the catalogue with the api_mcp_resources setting: a comma separated list, or a JSON array, of the resource keys to expose. Absent or empty exposes everything, so nothing changes by default. The setting fails closed everywhere: a resource left out of the list has no tools, cannot be read through a rise:// URI, and is not returned as a related collection of another record's document either. Lookup and utility tools are always available. Responses are compact JSON, not pretty printed.

Batch arrays and notifications follow the JSON-RPC 2.0 spec: any method starting with notifications/ produces no response, and a payload made only of notifications returns HTTP 202 with an empty body. Tool failures come back as isError: true results rather than protocol errors so the agent can read and react to the message: validation failures carry the reason, while unexpected internal failures return a generic message and the detail is written to the RISE error log instead of being sent to the client. Resource and prompt failures are protocol errors instead, per the MCP spec: code -32002 for a resource that cannot be read, -32602 for a bad prompt name or a missing prompt argument. The server is disabled by default - set the api_mcp_enabled setting to 1 to turn it on. Point your MCP client at this URL and send the authtoken header.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
jsonrpc String Mandatory Must be "2.0"
method String Mandatory One of initialize, ping, tools/list, tools/call, resources/list, resources/templates/list, resources/read, prompts/list, prompts/get, notifications/*
id Number optional Optional Request id (number or string). Omit it to send a notification, which returns no response
params Object optional Optional Method parameters. For tools/call: name and arguments . For tools/list: an optional cursor . For resources/read: uri . For prompts/get: name and arguments
curl -X POST "https://yoursite.com/api/mcp" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "jsonrpc": "...", "method": "..." }'

initialize:

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "result": {
    "protocolVersion": "2024-11-05",
    "capabilities": {
      "tools": { "listChanged": false },
      "resources": { "subscribe": false, "listChanged": false },
      "prompts": { "listChanged": false }
    },
    "serverInfo": { "name": "rise-crm-rest-api", "version": "2.1.0" }
  },
  "id": 1
}

tools/list:

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "result": {
    "tools": [
      {
        "name": "clients_list",
        "description": "List RISE CRM clients, newest first, soft-deleted rows excluded. Clients are the converted customer companies that projects, invoices, estimates, tickets and contracts are attached to. Page with limit and offset; narrow the created_date range with created_after and created_before; match exact column values with filters.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "limit": { "type": "integer", "description": "Max rows, default 25.", "minimum": 1, "maximum": 100 },
            "offset": { "type": "integer", "description": "Rows to skip.", "minimum": 0 },
            "created_after": { "type": "string", "description": "Lower bound on created_date. YYYY-MM-DD or YYYY-MM-DD HH:MM:SS." },
            "created_before": { "type": "string", "description": "Upper bound on created_date, same format." },
            "filters": { "type": "object", "description": "Exact-match filters, e.g. {\"client_id\":12}. Useful: owner_id, created_by, type, country. Unknown columns ignored.", "additionalProperties": true }
          }
        }
      },
      {
        "name": "clients_search",
        "description": "Find RISE CRM clients by keyword, matched as a substring of company_name, address, city, state, zip, country, phone, vat_number. Use it to turn a name or title into a record id.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "q": { "type": "string", "description": "Keyword. Case-insensitive substring match." },
            "limit": { "type": "integer", "description": "Max rows, default 25.", "minimum": 1, "maximum": 100 }
          },
          "required": ["q"]
        }
      }
    ]
  },
  "id": 2
}

tools/list paged (opt in with a cursor):

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "result": {
    "tools": [],
    "nextCursor": "dG9vbHM6NTA"
  },
  "id": 2
}

resources/list:

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "result": {
    "resources": [
      { "uri": "rise://server/info", "name": "RISE server info", "mimeType": "application/json" },
      { "uri": "rise://catalogue/resources", "name": "RISE record catalogue", "mimeType": "application/json" },
      { "uri": "rise://catalogue/lookups", "name": "RISE lookup values", "mimeType": "application/json" }
    ]
  },
  "id": 6
}

resources/read of rise://invoices/48:

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "result": {
    "contents": [
      {
        "uri": "rise://invoices/48",
        "mimeType": "application/json",
        "text": "{\"resource\":\"invoices\",\"id\":48,\"record\":{...},\"items\":[...],\"payments\":[...]}"
      }
    ]
  },
  "id": 7
}

prompts/list:

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "result": {
    "prompts": [
      {
        "name": "summarise_client",
        "description": "Summarise a client: who they are, their contacts, active work, invoicing position and what to do next.",
        "arguments": [
          { "name": "client_id", "description": "Numeric client id. Use clients_search to find it from a company name.", "required": true }
        ]
      }
    ]
  },
  "id": 8
}

prompts/get summarise_client:

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "result": {
    "description": "Summarise a client: who they are, their contacts, active work, invoicing position and what to do next.",
    "messages": [
      { "role": "user", "content": { "type": "text", "text": "Summarise RISE CRM client 12 for an account review. ..." } },
      { "role": "user", "content": { "type": "resource", "resource": { "uri": "rise://clients/12", "mimeType": "application/json", "text": "{...}" } } }
    ]
  },
  "id": 9
}

tools/call:

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\n    \"count\": 1,\n    \"records\": [\n        {\n            \"id\": \"12\",\n            \"company_name\": \"Acme Corporation\",\n            \"city\": \"San Francisco\",\n            \"created_date\": \"2026-02-14 09:21:45\"\n        }\n    ]\n}"
      }
    ],
    "isError": false
  },
  "id": 1
}

Notification only payload:

HTTP/1.1 202 Accepted

MCP server disabled:

HTTP/1.1 403 Forbidden
{
  "jsonrpc": "2.0",
  "error": { "code": -32000, "message": "MCP server is disabled." },
  "id": null
}

Parse error:

HTTP/1.1 400 Bad Request
{
  "jsonrpc": "2.0",
  "error": { "code": -32700, "message": "Parse error: the request body must be a JSON-RPC 2.0 object or array." },
  "id": null
}

Unknown method:

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "error": { "code": -32601, "message": "Method not found: tools/get" },
  "id": 3
}

Tool failure (isError result, not a protocol error):

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "result": {
    "content": [{ "type": "text", "text": "Error: Client 999 was not found." }],
    "isError": true
  },
  "id": 4
}

Resource that cannot be read:

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "error": { "code": -32002, "message": "Invoice 999 was not found." },
  "id": 7
}

Missing prompt argument:

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "error": { "code": -32602, "message": "The \"summarise_client\" prompt requires the \"client_id\" argument." },
  "id": 9
}

Batch

Run Batch Operations

POST/api/batch

Execute up to 50 operations in one request, in the order they were sent. Operations use the same names and arguments as the MCP tools exposed by /api/mcp (for example clients_list, clients_get, clients_search, invoices_create, tasks_update, taxes_delete, plus the lookup tools such as list_task_statuses and the utilities get_current_datetime and get_server_info). Names follow the resource_action convention, where action is one of list, get, search, create, update or delete. When the MCP server is enabled you can also call tools/list on it to discover every available operation name and its argument schema.

Because the operations run through the same registry as the MCP server, they inherit the same protections: credential and secret columns are never returned, write payloads are whitelisted against the real table columns, privilege columns cannot be mass assigned and administrator or staff accounts cannot be modified. Every operation name is additionally checked against the tool catalogue this token can see before it runs, so a name that is not catalogued is refused instead of being executed.

Batch is a REST feature in its own right and does not require the MCP server: it ignores the api_mcp_enabled setting, so it keeps working on a site where MCP is deliberately switched off. It has its own kill switch instead, api_batch_enabled, which is ON unless it is explicitly turned off - set it to 0 in the RISE settings to disable this endpoint (it then answers 403) without disabling the rest of the REST API.

The default behaviour is continue-on-error: a failing operation does not abort the batch, it is simply reported as failed and the next one runs. Send stop_on_error as true to abort at the first failure instead; the operations that were never attempted are counted in skipped and do not appear in results.

Each result carries its zero based index, the tool that was requested, an ok flag and then either data (on success) or error (on failure). The HTTP status is 200 even when some operations fail - read the per-item ok flags and the failed counter to find out what happened. Batch operations are not transactional: successful writes are not rolled back when a later operation fails.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
operations Object[] Mandatory Non-empty list of operations to run, maximum 50
operations.tool String Mandatory Name of the MCP tool to run, for example clients_create. The alias name is also accepted
operations.arguments Object optional Optional Arguments for that tool. Defaults to an empty object. The alias args is also accepted
stop_on_error Boolean optional Optional Abort the batch at the first failing operation instead of continuing

default: false

curl -X POST "https://yoursite.com/api/batch" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "operations": "...", "operations.tool": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "total": 2,
  "completed": 2,
  "failed": 0,
  "skipped": 0,
  "stopped_on_error": false,
  "stopped_at_index": null,
  "results": [
    {
      "index": 0,
      "tool": "clients_create",
      "ok": true,
      "data": {
        "status": true,
        "id": 142,
        "record": {
          "id": "142",
          "company_name": "Acme Corporation",
          "city": "San Francisco",
          "created_date": "2026-02-14 09:21:45"
        }
      }
    },
    {
      "index": 1,
      "tool": "taxes_list",
      "ok": true,
      "data": {
        "count": 2,
        "limit": 2,
        "offset": 0,
        "records": [
          { "id": "1", "title": "VAT (24%)", "percentage": "24.00" },
          { "id": "2", "title": "Tax (10%)", "percentage": "10.00" }
        ]
      }
    }
  ]
}

Partial-Failure-Response:

HTTP/1.1 200 OK
{
  "status": false,
  "total": 3,
  "completed": 2,
  "failed": 1,
  "skipped": 0,
  "stopped_on_error": false,
  "stopped_at_index": null,
  "results": [
    { "index": 0, "tool": "clients_create", "ok": true,  "data": { "status": true, "id": 142 } },
    { "index": 1, "tool": "invoices_get",   "ok": false, "error": "Invoice 999 was not found." },
    { "index": 2, "tool": "tasks_update",   "ok": true,  "data": { "status": true, "id": 88 } }
  ]
}

Stopped-On-Error-Response:

HTTP/1.1 200 OK
{
  "status": false,
  "total": 3,
  "completed": 1,
  "failed": 1,
  "skipped": 1,
  "stopped_on_error": true,
  "stopped_at_index": 1,
  "results": [
    { "index": 0, "tool": "clients_create", "ok": true,  "data": { "status": true, "id": 142 } },
    { "index": 1, "tool": "invoices_get",   "ok": false, "error": "Invoice 999 was not found." }
  ]
}

Batch-Disabled:

HTTP/1.1 403 Forbidden
{
  "status": 403,
  "error": 403,
  "messages": {
    "error": "The batch endpoint is disabled. An administrator can turn it back on by setting \"api_batch_enabled\" to 1 in the RISE settings."
  }
}

Missing-Operations:

HTTP/1.1 400 Bad Request
{
  "status": 400,
  "error": 400,
  "messages": {
    "operations": "Provide a non-empty \"operations\" array, where each entry names an MCP tool and its arguments."
  }
}

Too-Many-Operations:

HTTP/1.1 400 Bad Request
{
  "status": 400,
  "error": 400,
  "messages": {
    "error": "Too many operations: 120 were sent but a batch may carry at most 50. Split the work into smaller batches."
  }
}

Unknown-Operation (reported per item, not as an HTTP error):

HTTP/1.1 200 OK
{
  "status": false,
  "total": 1,
  "completed": 0,
  "failed": 1,
  "skipped": 0,
  "stopped_on_error": false,
  "stopped_at_index": null,
  "results": [
    { "index": 0, "tool": "clients_purge", "ok": false, "error": "Unknown operation \"clients_purge\". Batch only runs operations that exist in the tool catalogue this token can see." }
  ]
}

Webhooks

List all Webhooks

GET/api/webhooks

Lists the configured webhook subscriptions, newest first. The signing secret is never part of a read response; only the has_secret flag tells you whether one is set.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
active Number optional Optional Only return enabled (1) or disabled (0) webhooks
limit Number optional Optional Page size, 1 to 200

default: 50

offset Number optional Optional Rows to skip

default: 0

curl -X GET "https://yoursite.com/api/webhooks" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": 3,
    "name": "Ops sync",
    "url": "https://hooks.example.com/rise",
    "events": ["invoices.created", "tickets.*"],
    "headers": { "X-Env": "production" },
    "active": 1,
    "timeout": 10,
    "retry_count": 1,
    "last_triggered": "2026-07-22 14:32:10",
    "success_count": 128,
    "failure_count": 2,
    "created_by": 1,
    "created_at": "2026-07-01 09:12:44",
    "updated_at": "2026-07-22 14:32:10",
    "has_secret": true,
    "signature_header": "X-Rise-Signature"
  }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Add New Webhook

POST/api/webhooks

Creates a webhook subscription and mints its signing secret.

The secret is returned in this response and in no other response, ever. Store it now: no endpoint can show it again. If it is lost, rotate it with a PUT that sets rotate_secret to true.

Every delivery is a JSON POST carrying the header X-Rise-Signature: t=<unix>,v1=<hex hmac_sha256 of "{t}.{raw body}" keyed with the secret>. Verify it by recomputing the HMAC over the exact bytes you received, comparing in constant time, and rejecting a t outside your own tolerance window - that is what makes a captured delivery unreplayable.

The target URL is validated exactly as you send it, so percent-encoded characters and multi-parameter query strings are preserved and accepted - https://hooks.example.com/rise?env=production&team=ops%2Feu is a valid target and is stored byte for byte. It is checked against the SSRF policy: it must be a well formed absolute URL, only http and https are accepted, the host is resolved, and the request is refused when any resolved address is loopback, link-local or cloud metadata (169.254.0.0/16), an RFC1918 private range (10/8, 172.16/12, 192.168/16), carrier-grade NAT, multicast, broadcast, or an IPv6 equivalent. The same check runs again immediately before every delivery, redirects are never followed, and TLS certificate verification is always enforced.

Delivery is asynchronous. A matching event is written to the delivery queue while the CRM operation that produced it returns immediately, and the queued deliveries are sent by the RISE cron job - so a slow or unreachable receiver can never slow down or break the CRM. A failed delivery is retried with exponential backoff over the next few cron runs; every attempt, successful or not, appears in the delivery log of this webhook. If deliveries are queued but nothing ever arrives, check that the RISE cron job is configured and running.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
name String Mandatory Human readable name, up to 191 characters
url String Mandatory Target URL, http or https, public host, up to 500 characters
events String[] Mandatory Event names to subscribe to. Accepts an array or a comma separated string. Use * for everything or .* for one resource. See GET /api/webhooks/events
headers Object optional Optional Extra request headers to send, up to 20. A name may use letters, digits, hyphens and underscores and must start with a letter or a digit; a value must be printable ASCII of at most 255 characters. Transport and signature headers cannot be overridden
active Number optional Optional 1 to start delivering immediately, 0 to create it disabled

default: 1

timeout Number optional Optional Per attempt timeout in seconds, 1 to 30

default: 10

retry_count Number optional Optional Extra attempts after a failed one, 0 to 3

default: 1

created_by Number optional Optional User ID to credit the record to, validated against the users table
curl -X POST "https://yoursite.com/api/webhooks" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "name": "...", "url": "...", "events": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": { "success": "Record saved" },
  "id": 3,
  "secret": "whsec_4f3a00000000000000000000000000000000000000000000000000000000009c1",
  "secret_notice": "Store this secret now. It is shown once and cannot be retrieved again.",
  "signature_header": "X-Rise-Signature",
  "data": {
    "id": 3,
    "name": "Ops sync",
    "url": "https://hooks.example.com/rise",
    "events": ["invoices.created", "tickets.*"],
    "active": 1,
    "has_secret": true
  }
}

Validation-Error:

HTTP/1.1 400 Bad Request
{
  "status": false,
  "messages": {
    "url": "URL rejected: the host resolves to 127.0.0.1 (loopback, link-local or otherwise reserved address)",
    "events": "Unknown events: invoice_created. See GET /api/webhooks/events for the catalogue."
  }
}

Delete a Webhook

DELETE/api/webhooks/{id}

Removes the subscription together with its delivery logs and any deliveries still waiting in the queue. Nothing is delivered to that URL afterwards, not even an event that was queued before the deletion.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Webhook unique ID
curl -X DELETE "https://yoursite.com/api/webhooks/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": { "success": "Record deleted" } }

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Get Webhook by ID

GET/api/webhooks/{id}

Returns one webhook. The signing secret is never returned here - it is shown once, when the webhook is created or when its secret is rotated.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Webhook unique ID
curl -X GET "https://yoursite.com/api/webhooks/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "id": 3,
  "name": "Ops sync",
  "url": "https://hooks.example.com/rise",
  "events": ["invoices.created", "tickets.*"],
  "headers": { "X-Env": "production" },
  "active": 1,
  "timeout": 10,
  "retry_count": 1,
  "last_triggered": "2026-07-22 14:32:10",
  "success_count": 128,
  "failure_count": 2,
  "created_by": 1,
  "created_at": "2026-07-01 09:12:44",
  "updated_at": "2026-07-22 14:32:10",
  "has_secret": true,
  "signature_header": "X-Rise-Signature"
}

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Update a Webhook

PUT/api/webhooks/{id}

Partial update: only the fields present in the request are written, everything else keeps its current value. The same validation as create applies, including the SSRF check on a new URL.

The signing secret cannot be set by the caller. Send rotate_secret as true to have the server mint a new one; the replacement is returned in this response and, like the original, in no other response ever. A rotation invalidates the previous secret immediately, so update your receiver first or let it accept both for a short window.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Webhook unique ID
name String optional Optional Human readable name
url String optional Optional New target URL, validated exactly as sent and re-checked against the SSRF policy
events String[] optional Optional Replacement subscription list, array or comma separated string
headers Object optional Optional Replacement custom headers. Send an empty object or null to clear them
active Number optional Optional 1 to enable, 0 to disable
timeout Number optional Optional Per attempt timeout in seconds, 1 to 30
retry_count Number optional Optional Extra attempts after a failed one, 0 to 3
rotate_secret Boolean optional Optional Mint a new signing secret and return it once
curl -X PUT "https://yoursite.com/api/webhooks/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": { "success": "Record saved" },
  "data": {
    "id": 3,
    "name": "Ops sync",
    "url": "https://hooks.example.com/rise",
    "events": ["invoices.created", "invoices.updated"],
    "active": 1,
    "timeout": 15,
    "has_secret": true
  }
}

Secret-Rotated:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": { "success": "Record saved" },
  "secret": "whsec_8b2100000000000000000000000000000000000000000000000000000000edf4",
  "secret_notice": "Store this secret now. It is shown once and cannot be retrieved again.",
  "signature_header": "X-Rise-Signature",
  "data": { "id": 3, "has_secret": true }
}

Not-Found:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Nothing-To-Update:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "No updatable field was provided." } }

Webhook Delivery Logs

GET/api/webhooks/{id}/logs

The delivery history of one webhook, newest first: one row per attempt, with the HTTP status code, the attempt number, a snippet of the response body, the error reason when there was one, how long the attempt took and when it ran. Blocked deliveries are logged too, with the SSRF reason in error_message.

A row appears here when an attempt is actually made, which is when the RISE cron job drains the delivery queue - not at the moment the CRM produced the event. An empty log right after a change in the CRM usually means the cron job has not run yet.

Only the most recent 500 attempts of a webhook are kept; older rows are pruned automatically.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Webhook unique ID
status String optional Optional Only return attempts with this outcome
event String optional Optional Only return attempts of this event name
limit Number optional Optional Page size, 1 to 200

default: 50

offset Number optional Optional Rows to skip

default: 0

curl -X GET "https://yoursite.com/api/webhooks/123/logs" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "webhook_id": 3,
  "count": 2,
  "total": 2,
  "limit": 50,
  "offset": 0,
  "logs": [
    {
      "id": 982,
      "webhook_id": 3,
      "event": "invoices.created",
      "url": "https://hooks.example.com/rise",
      "delivery_id": "dlv_9f2c7a1b4d5e6f708192a3b4",
      "payload": "{\"event\":\"invoices.created\",\"resource\":\"invoices\",\"action\":\"created\",\"delivery_id\":\"dlv_9f2c7a1b4d5e6f708192a3b4\",\"timestamp\":1784000000,\"data\":{\"id\":42}}",
      "status": "success",
      "response_code": 200,
      "response_body": "{\"ok\":true}",
      "error_message": null,
      "attempt_number": 1,
      "duration_ms": 142,
      "triggered_at": "2026-07-22 14:32:10"
    },
    {
      "id": 981,
      "webhook_id": 3,
      "event": "tickets.updated",
      "url": "https://hooks.example.com/rise",
      "delivery_id": "dlv_1a2b3c4d5e6f708192a3b4c5",
      "status": "failed",
      "response_code": 500,
      "response_body": "Internal Server Error",
      "error_message": "HTTP 500: Internal Server Error",
      "attempt_number": 2,
      "duration_ms": 3011,
      "triggered_at": "2026-07-22 14:21:40"
    }
  ]
}

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Enable or Disable a Webhook

POST/api/webhooks/{id}/toggle

Flips the enabled flag. Send an explicit value in the body to set it instead of flipping it. A disabled webhook keeps its configuration, its secret and its delivery history, but receives nothing: it stops producing new queued deliveries at once, and anything already queued for it is discarded rather than sent when the cron job next runs.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Webhook unique ID
active Number optional Optional 1 to enable, 0 to disable. Omit it to flip the current value
curl -X POST "https://yoursite.com/api/webhooks/123/toggle" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": { "success": "Record saved" },
  "active": 0,
  "data": { "id": 3, "name": "Ops sync", "active": 0, "has_secret": true }
}

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Webhook Event Catalogue

GET/api/webhooks/events

The authoritative list of names a webhook can subscribe to. It is derived from the REST resource surface of this RISE installation, so it always matches the resources that really exist: every writable resource contributes <resource>.created, <resource>.updated and <resource>.deleted.

Three subscription shapes are accepted: the exact event name (invoices.created), the resource wildcard (invoices.*, every event of that resource) and the global wildcard (*, every event of every resource). The read-only activity log resource emits nothing, since it is itself an audit trail of the other resources.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/webhooks/events" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "total_events": 102,
  "wildcard": "*",
  "resource_wildcard": "<resource>.*",
  "signature_header": "X-Rise-Signature",
  "groups": {
    "clients": {
      "clients.created": "Client created",
      "clients.updated": "Client updated",
      "clients.deleted": "Client deleted",
      "clients.*": "Every client event"
    },
    "invoices": {
      "invoices.created": "Invoice created",
      "invoices.updated": "Invoice updated",
      "invoices.deleted": "Invoice deleted",
      "invoices.*": "Every invoice event"
    }
  }
}

Automation

Poll a resource for new or updated records

GET/api/automation/poll/{resource}

The endpoint an n8n, Zapier or Make polling trigger calls on a schedule. Returns the records of one resource that were created - or, where RISE tracks it, changed - on or after the cursor, newest first.

How to drive it: on the first run send no cursor, which returns the last 24 hours. On every later run send back the meta.next_since value from the previous response. That value is the RISE server clock read at the start of the request, so nothing written while the query ran can fall between two polls. De-duplicate on the id field: the cursor is inclusive and some RISE columns store a date without a time, so a record can legitimately come back twice. meta.has_more only means the page came back full, so older matches may have been cut off. Do NOT re-poll with the same cursor expecting the next page - the query is not offset-paged, so an identical request returns the identical page. Raise limit, or poll more often so a window never fills.

On updates: RISE has no generic modified timestamp. A resource whose table carries a column that moves when the record is touched (a ticket's last activity, a task's status change, an invoice's cancellation) is polled on those columns too. meta.detects_updates says whether that is the case, and meta.cursor_fields lists exactly which columns were compared, so a connector can label its trigger honestly rather than promise updates it will not receive.

All timestamps in and out are UTC, which is what RISE stores. A cursor sent without an offset is read as UTC. An empty result is a normal 200 with an empty data array, never a 404, so a polling trigger does not have to treat "nothing happened" as an error.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
resource String Resource key from /api/automation/resources. Hyphens are accepted in place of underscores, so both invoice-payments and invoice_payments work.
since String optional Cursor. ISO 8601 date or date-time, with or without an offset, or a Unix timestamp in seconds. Naive values are read as UTC. Defaults to 24 hours before the server clock. Must be on or after 2000-01-01 and no more than 24 hours ahead of the server clock.
limit Number optional Maximum records to return, 1 to 100. Larger values are reduced to 100.

default: 50

curl -X GET "https://yoursite.com/api/automation/poll/clients" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "resource": "tickets",
  "data": [
    {
      "id": "482",
      "client_id": "12",
      "title": "Cannot log in to the portal",
      "status": "open",
      "assigned_to": "3",
      "created_at": "2026-07-21 09:12:00",
      "last_activity_at": "2026-07-21 09:40:11",
      "deleted": "0"
    }
  ],
  "meta": {
    "count": 1,
    "limit": 50,
    "has_more": false,
    "since": "2026-07-21T09:00:00+00:00",
    "since_source": "parameter",
    "next_since": "2026-07-21T09:45:12+00:00",
    "server_time": "2026-07-21T09:45:12+00:00",
    "timezone": "UTC",
    "cursor_fields": ["created_at", "last_activity_at", "client_last_activity_at", "closed_at"],
    "order_by": "created_at",
    "detects_updates": true,
    "dedupe_key": "id"
  }
}

Nothing changed:

HTTP/1.1 200 OK
{
  "status": true,
  "resource": "tickets",
  "data": [],
  "meta": { "count": 0, "limit": 50, "has_more": false, "since": "2026-07-21T09:40:00+00:00", "since_source": "parameter", "next_since": "2026-07-21T09:45:12+00:00", "dedupe_key": "id" }
}

Invalid cursor:

HTTP/1.1 400 Bad Request
{
  "status": false,
  "messages": { "since": "The \"since\" parameter must be an ISO 8601 date or date-time, or a Unix timestamp in seconds. Accepted examples: 2026-07-21T09:30:00Z, 2026-07-21T11:30:00+02:00, 2026-07-21 09:30:00, 2026-07-21, 1753090200." }
}

Resource cannot be polled:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "The \"taxes\" resource has no date column in RISE, so it cannot be polled by timestamp. Read it through its own REST endpoint instead." } }

Unknown resource:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "Unknown automation resource. Call /api/automation/resources for the resources that can be polled." } }

List pollable Automation resources

GET/api/automation/resources

Discovery endpoint for a polling trigger. Returns every RISE resource that can be polled by timestamp, together with the path to poll it, the columns the cursor is built from, the field to de-duplicate on, and whether the resource can detect updates as well as new records. Call this once when building the connector: the list is derived from the live REST resource catalogue and the live database schema, so it stays correct as RISE and the plugin change. Resources with no date column at all (small lookup tables such as taxes, items and labels) cannot be polled by timestamp and are reported under meta.not_pollable instead - read those through their own REST endpoints.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/automation/resources" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "data": [
    {
      "key": "clients",
      "label": "client",
      "plural": "clients",
      "trigger_label": "New clients",
      "description": "Clients are the converted customer companies that projects, invoices, estimates, tickets and contracts are attached to.",
      "poll_path": "/api/automation/poll/clients",
      "sample_path": "/api/automation/sample/clients",
      "cursor_fields": ["created_date"],
      "order_by": "created_date",
      "dedupe_key": "id",
      "detects_updates": false
    },
    {
      "key": "tickets",
      "label": "ticket",
      "plural": "tickets",
      "trigger_label": "New or updated tickets",
      "description": "Support tickets raised by clients or staff, with a ticket type, assignee, status and a thread of ticket comments.",
      "poll_path": "/api/automation/poll/tickets",
      "sample_path": "/api/automation/sample/tickets",
      "cursor_fields": ["created_at", "last_activity_at", "client_last_activity_at", "closed_at"],
      "order_by": "created_at",
      "dedupe_key": "id",
      "detects_updates": true
    }
  ],
  "meta": {
    "count": 2,
    "not_pollable": [
      { "key": "taxes", "reason": "The taxes table has no date column, so it cannot be filtered by a since cursor." }
    ],
    "dedupe_key": "id",
    "default_limit": 50,
    "max_limit": 100,
    "default_lookback_hours": 24,
    "since_formats": ["2026-07-21T09:30:00Z", "2026-07-21T11:30:00+02:00", "2026-07-21 09:30:00", "2026-07-21", "1753090200"],
    "timezone": "UTC",
    "server_time": "2026-07-21T09:45:12+00:00",
    "authentication": { "header": "authtoken", "query_parameter_supported": false }
  }
}

Error-Response:

HTTP/1.1 500 Internal Server Error
{ "status": false, "messages": { "error": "The automation request could not be completed. The details were written to the RISE error log." } }

Get a sample Automation record

GET/api/automation/sample/{resource}

Returns one representative record for the resource - the most recent one - so an automation platform can show the user a real payload and let them map fields onto later steps. When the resource holds no records yet the endpoint still answers 200 with an empty field map built from the live table definition, so field mapping works on a fresh install; meta.source says which of the two you got ("record" or "schema"). The field list in meta.fields gives each returned column with its SQL type. Credential and sensitive columns are stripped exactly as they are everywhere else in this plugin, so they appear neither in the record nor in the field list.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
resource String Resource key from /api/automation/resources. Hyphens are accepted in place of underscores, so both invoice-payments and invoice_payments work.
curl -X GET "https://yoursite.com/api/automation/sample/clients" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "resource": "clients",
  "data": {
    "id": "12",
    "company_name": "Acme Corporation",
    "type": "organization",
    "city": "San Francisco",
    "country": "United States",
    "created_date": "2026-07-14 09:21:45",
    "owner_id": "3",
    "created_by": "1",
    "is_lead": "0",
    "deleted": "0"
  },
  "meta": {
    "source": "record",
    "label": "client",
    "plural": "clients",
    "dedupe_key": "id",
    "cursor_fields": ["created_date"],
    "order_by": "created_date",
    "detects_updates": false,
    "fields": [
      { "name": "id", "type": "int" },
      { "name": "company_name", "type": "varchar" },
      { "name": "created_date", "type": "datetime" }
    ],
    "timezone": "UTC",
    "server_time": "2026-07-21T09:45:12+00:00"
  }
}

Unknown resource:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "Unknown automation resource. Call /api/automation/resources for the resources that can be polled." } }

OpenAPI

Get the OpenAPI specification

GET/api/openapi.json

Returns an OpenAPI 3.0 document that describes every endpoint of the REST API for RISE CRM: list, get by id, search, create, update and delete for each resource, plus the miscellaneous helper endpoints. Import the URL into Swagger UI, Postman, Insomnia or n8n to get a ready made client without writing anything by hand. The server URL is detected from the installation, so it already contains /index.php when your RISE installation is routed that way.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
pretty Number optional Set to 0 to receive the document without indentation, which is roughly 60% smaller and preferable for machine consumers

default: 1

curl -X GET "https://yoursite.com/api/openapi.json" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "openapi": "3.0.3",
  "info": { "title": "REST API for RISE CRM", "version": "2.1.0" },
  "servers": [ { "url": "https://yourdomain.com/index.php/api" } ],
  "security": [ { "authtoken": [] } ],
  "paths": {
    "/taxes": { "get": { "operationId": "getTaxes" }, "post": { "operationId": "createTax" } },
    "/taxes/{id}": { "get": { "operationId": "showTax" } },
    "/taxes/search/{keyword}": { "get": { "operationId": "searchTaxes" } }
  }
}

Invalid-Token:

HTTP/1.1 200 OK
{ "status": false, "message": "Token not found" }

Tooling

API Playground

GET/api/playground

Renders the interactive API playground: a single self-contained HTML page that lets you try every endpoint of this installation from the browser. The endpoint catalogue is built at runtime from /api/openapi.json, so it always matches the routes this installation really exposes.

The page is a static shell - it carries no CRM data and no token - so it is served without the authtoken header, which a browser cannot send when you navigate to a URL. Paste a token into the toolbar and press Load endpoints: the token is kept in the page's memory only (never in a cookie, localStorage, sessionStorage or the URL, and gone the moment you reload or close the tab) and is attached as the authtoken header to the specification fetch and to every request you send from the page. Requests reach the very same endpoints as any other client, so writes really do change live data - non GET requests ask for confirmation first.

No CSS, JavaScript or font is loaded from a third party host, and the page is served with a Content-Security-Policy that allows code only from the document itself and network calls only back to this installation.

curl -X GET "https://yoursite.com/api/playground" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8

Download the Postman collection

GET/api/postman.json

Returns a ready to import Postman v2.1 collection covering every endpoint registered under the api route group. The collection declares two variables, {{base_url}} (pre-filled with this installation URL) and {{authtoken}} (intentionally left empty - paste your own token after import). Collection level auth sends {{authtoken}} as the authtoken header on every request. Requests are foldered by apidoc group and carry the endpoint description plus a sample JSON body built from the documented body parameters. Routes registered with $routes->add() answer any HTTP verb; they are exported once as GET and labelled (any verb). Any route line the generator cannot read is listed in a trailing ! Unparsed routes folder instead of being dropped silently.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/postman.json" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "info": { "name": "RISE CRM REST API", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" },
  "variable": [ { "key": "base_url", "value": "https://crm.example.com" }, { "key": "authtoken", "value": "" } ],
  "item": [ { "name": "Taxes", "item": [ { "name": "GET - List all Taxes" } ] } ]
}

API Playground (Swagger UI)

GET/api/swagger

Renders a self-contained Swagger UI page wired to /api/openapi.json. Swagger UI itself is loaded from the jsDelivr CDN, so the browser needs outbound access to cdn.jsdelivr.net. This page is a static HTML shell: it carries no CRM data and no token, so it is served without the authtoken header (a browser cannot send one when you navigate to a URL). The toolbar at the top of the page accepts an authtoken which is kept in the page's memory only - it is never written to cookies, localStorage or sessionStorage - and is injected as the authtoken header on every request Swagger UI makes, including the OpenAPI document fetch. Every endpoint you call from the page is still protected by the normal token check.

curl -X GET "https://yoursite.com/api/swagger" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8

Reporting

List available reports

GET/api/reports

Discovery endpoint for a dashboard or BI tool. Returns every reporting endpoint this plugin exposes, the query parameters each one accepts and the shared date range rules, so a client can build its panels without hardcoding the catalogue.

meta.max_groups is the largest page a grouped list will return. The reports that expose limit and offset page their list with it, and every report that caps a list reports the cap through its own meta.truncated map, so nothing is ever dropped in silence.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/reports" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "data": [
    {
      "key": "summary",
      "path": "/api/reports/summary",
      "description": "Headline counts across clients, leads, projects, tasks, tickets and invoices, as of now.",
      "parameters": []
    }
  ],
  "meta": {
    "date_format": "YYYY-MM-DD",
    "default_range_days": 30,
    "max_range_days": 366,
    "server_date": "2026-07-22"
  }
}

Invoiced vs paid vs outstanding

GET/api/reports/invoices

Billing performance over a date range. The range is applied to the invoice bill_date, so "invoiced" is what was billed in the window. Two payment figures are returned because they answer different questions: paid_against_invoices is what has been collected against the invoices billed in the window whenever the money arrived, while received_in_range is what actually landed in the window whatever it was billed against. A cash flow chart wants the second; an aged debt figure wants the first.

Outstanding is the unpaid remainder of the not_paid invoices in the window. Draft, cancelled and credited invoices are counted and reported but contribute nothing to outstanding, exactly as in the RISE invoice screens. Overdue applies the same tolerance the CRM uses, so a rounding cent does not keep an invoice on the overdue list.

The timeline array carries one entry per calendar month touched by the range, with both what was billed and what was received in that month, ready to plot without further aggregation. It is capped at 24 months, which the 366 day range limit already keeps out of reach, and the cap reports itself through meta.truncated.timeline so a shortened timeline can never pass for a complete one.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
from String optional Start of the range, inclusive, YYYY-MM-DD. Defaults to 29 days before to.
to String optional End of the range, inclusive, YYYY-MM-DD. Defaults to the RISE server date.
client_id Number optional Restrict every figure to one client.
curl -X GET "https://yoursite.com/api/reports/invoices" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "data": {
    "range": { "from": "2026-04-01", "to": "2026-06-30", "days": 91, "date_field": "invoices.bill_date" },
    "invoices": {
      "count": 42,
      "invoiced": 154200, "subtotal": 141000, "discount_total": 2800, "tax_total": 16000,
      "outstanding": 29000, "overdue_count": 6, "overdue_amount": 8700,
      "by_status": {
        "draft": { "count": 3, "total": 4100 },
        "not_paid": { "count": 30, "total": 121000 },
        "cancelled": { "count": 1, "total": 900 },
        "credited": { "count": 8, "total": 28200 }
      }
    },
    "payments": { "paid_against_invoices": 121000, "received_in_range": 130500, "received_count": 88 },
    "credit_notes": { "count": 2, "total": 1400 },
    "timeline": [ { "month": "2026-04", "invoice_count": 14, "invoiced": 51000, "payment_count": 29, "received": 44100 } ]
  },
  "meta": {
    "generated_at": "2026-07-22 10:04:11",
    "paid_status_tolerance": 0.02,
    "truncated": { "timeline": false }
  }
}

Error-Response:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "The date range cannot be wider than 366 days. Ask for a shorter window." } }

Project and task throughput

GET/api/reports/projects

Delivery throughput over a date range: how many projects were opened, how many tasks were created, and how many tasks reached a done status inside the window. Task completion is read from tasks.status_changed_at, the only completion timestamp RISE keeps, and done is resolved through task_status.key_name so custom statuses are handled correctly.

Projects are counted on their created_date. RISE stores no project completion timestamp, so the status split under projects describes the current status of the projects created in the window rather than transitions that happened during it. open_now and overdue_now under tasks are likewise live snapshots and deliberately ignore the range.

Project state is read from projects.status_id joined to the project_status table, which is what the RISE application writes and filters on. projects.by_status keeps the four named buckets open, completed, hold and canceled that RISE ships with, so an existing dashboard is unaffected; projects.statuses carries the full split, one entry per project status actually in use, with its id, its stable key and its human readable title translated the way the project screens translate it. An installation that added its own status sees it in statuses and in created, but in none of the four named buckets, so read statuses to stay future proof. key_name falls back to project_status.title_language_key because RISE seeds Hold and Canceled with an empty key_name.

by_project ranks the busiest projects in the window by tasks created, with the completions for the same project, which is what a delivery dashboard plots as a leaderboard. It is a paged list: limit and offset select the page, and data.pagination reports limit, offset, returned, truncated and next_offset. truncated true means more projects match, and next_offset is the offset that returns the following page. The figures under projects, tasks and milestones are whole range aggregates and never change with the page.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
from String optional Start of the range, inclusive, YYYY-MM-DD. Defaults to 29 days before to.
to String optional End of the range, inclusive, YYYY-MM-DD. Defaults to the RISE server date.
limit Number optional Projects per page in by_project.

default: 25

offset Number optional Projects to skip in by_project, for paging.

default: 0

curl -X GET "https://yoursite.com/api/reports/projects" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "data": {
    "range": { "from": "2026-06-23", "to": "2026-07-22", "days": 30, "date_field": "projects.created_date" },
    "projects": {
      "created": 12, "value": 84000,
      "by_status": { "open": 5, "completed": 4, "hold": 2, "canceled": 1 },
      "statuses": [ { "status_id": 3, "key_name": "hold", "title": "Hold", "count": 2 } ]
    },
    "tasks": { "created": 240, "completed": 198, "open_now": 173, "overdue_now": 24 },
    "milestones": { "due_in_range": 9 },
    "by_project": [ { "project_id": 7, "title": "Portal rebuild", "tasks_created": 64, "tasks_completed": 51 } ],
    "pagination": { "limit": 25, "offset": 0, "returned": 25, "truncated": true, "next_offset": 25 }
  },
  "meta": {
    "generated_at": "2026-07-22 10:04:11",
    "done_status_ids": [3],
    "truncated": { "project_statuses": false, "done_statuses": false }
  }
}

Error-Response:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "The \"from\" parameter must be a date in YYYY-MM-DD form, for example 2026-01-31." } }

Headline counts

GET/api/reports/summary

A single snapshot of the CRM as it stands right now: how many clients, leads, contacts and team members exist, how projects and tickets are split by status, how many tasks are open or overdue, and the invoiced, paid and outstanding money totals. This is the endpoint behind a dashboard's top row of tiles - it takes no date range, so the numbers are always "as of now" and never depend on the caller's window.

Soft-deleted records are excluded everywhere. Leads and clients share the clients table and are separated by the is_lead flag. Contacts and team members share the users table and are separated by user_type. Task completion is resolved through task_status.key_name = 'done', so a renamed or extra status is still classified correctly. Invoice money covers documents of type 'invoice' only.

Project state comes from projects.status_id joined to the project_status table, the pair the RISE application itself writes and filters on. The named fields open, completed, hold and canceled are the four statuses RISE ships with and are kept for existing dashboards; because an installation may rename them or add its own, data.projects.statuses carries the complete split with the status id, its stable key and its human readable title. A custom status is counted in data.projects.total and in statuses, but in none of the four named fields, so a client that wants to be future proof should read statuses rather than the named fields. RISE seeds Hold and Canceled with an empty project_status.key_name, so key_name falls back to project_status.title_language_key and is therefore always populated on a stock install. The title is translated exactly as the project screens translate it.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/reports/summary" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "data": {
    "clients": { "total": 128 },
    "leads": { "total": 54 },
    "contacts": { "total": 210 },
    "team_members": { "total": 12 },
    "projects": {
      "total": 63, "open": 21, "completed": 35, "hold": 4, "canceled": 3,
      "statuses": [ { "status_id": 1, "key_name": "open", "title": "Open", "count": 21 } ]
    },
    "tasks": {
      "total": 941, "open": 173, "done": 768, "overdue": 24,
      "by_status": [ { "status_id": 1, "key_name": "to_do", "title": "To Do", "count": 90 } ]
    },
    "tickets": {
      "total": 310, "open": 35, "closed": 275,
      "by_status": { "new": 5, "client_replied": 3, "open": 27, "closed": 275 }
    },
    "invoices": {
      "total": 220,
      "by_status": { "draft": 8, "not_paid": 40, "cancelled": 2, "credited": 1 },
      "invoiced": 154200, "paid": 121000, "outstanding": 33200,
      "overdue_count": 12, "overdue_amount": 8700
    }
  },
  "meta": {
    "generated_at": "2026-07-22 10:04:11",
    "paid_status_tolerance": 0.02,
    "truncated": { "project_statuses": false, "task_statuses": false, "done_statuses": false }
  }
}

Error-Response:

HTTP/1.1 500 Internal Server Error
{ "status": false, "messages": { "error": "The report could not be generated. The details were written to the RISE error log." } }

Logged hours

GET/api/reports/timesheets

Time logged over a date range, grouped by team member, project, task or day. Timesheets live in the project_time table, and the duration of an entry is what RISE itself computes: the difference between start_time and end_time plus the manually entered hours column. Totals therefore match the CRM's own timesheet screens to the second.

The range is applied to start_time, which RISE stores in UTC, so a caller that reports in a local timezone should shift its window accordingly. A running timer has no end_time yet and contributes nothing until it is stopped.

Every group carries both total_seconds and hours: seconds are exact and safe to sum further, hours are rounded to two decimals for display. Groups are returned largest first, except for group_by=day which is returned in date order so it can be plotted directly. Ordering is fully deterministic - ties are broken on the group key - so paging never repeats or skips a group.

The groups list is paged, identically for all four groupings. limit selects the page size, at most 200, offset selects the page, and data.pagination reports limit, offset, returned, truncated and next_offset. truncated true means more groups match the request and next_offset is the offset that returns the following page; truncated false means the list is complete. This matters most for group_by=day, because the range may be up to 366 days long while a page holds at most 200 days: such a request answers with the first 200 days, truncated true and next_offset 200, and never drops the remainder without saying so. data.totals is computed over the whole range by its own aggregate, so it is the same on every page and always exact.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
from String optional Start of the range, inclusive, YYYY-MM-DD. Defaults to 29 days before to.
to String optional End of the range, inclusive, YYYY-MM-DD. Defaults to the RISE server date.
group_by String optional How to group the logged time.

default: member

project_id Number optional Restrict to one project.
user_id Number optional Restrict to one team member.
limit Number optional Groups per page.

default: 200

offset Number optional Groups to skip, for paging.

default: 0

curl -X GET "https://yoursite.com/api/reports/timesheets" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "data": {
    "range": { "from": "2026-06-23", "to": "2026-07-22", "days": 30, "date_field": "project_time.start_time" },
    "group_by": "member",
    "totals": { "entries": 412, "total_seconds": 1234800, "hours": 343 },
    "groups": [
      { "group_id": 3, "label": "Jane Doe", "entries": 88, "total_seconds": 320400, "hours": 89 }
    ],
    "pagination": { "limit": 200, "offset": 0, "returned": 12, "truncated": false, "next_offset": null }
  },
  "meta": { "generated_at": "2026-07-22 10:04:11", "timezone": "UTC", "max_groups": 200 }
}

Error-Response:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "The \"group_by\" parameter must be one of: member, project, task, day." } }

Users

List all Users

GET/api/users

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
user_type String optional Optional filter by user type (staff, client, lead)
status String optional Optional filter by status (active, inactive)
curl -X GET "https://yoursite.com/api/users" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "1",
		"first_name": "John",
		"last_name": "Doe",
		"user_type": "staff",
		"is_admin": "1",
		"role_id": "0",
		"email": "john@example.com",
		"image": null,
		"status": "active",
		"client_id": "0",
		"is_primary_contact": "0",
		"job_title": "Admin",
		"phone": "1234567890",
		"gender": "male",
		"created_at": "2021-09-12 10:00:00"
}

Add New User

POST/api/users

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
first_name string Mandatory User first name
last_name string Mandatory User last name
email string Mandatory User email
user_type string Mandatory User type (staff, client, lead)
password string optional Optional User password
phone string optional Optional User phone
job_title string optional Optional Job title
gender string optional Optional Gender (male, female, other)
client_id number optional Optional Client ID (required for client user_type)
role_id number optional Optional Role ID (for staff)
status string optional Optional Status (active, inactive) default: active
address string optional Optional Address
skype string optional Optional Skype ID
curl -X POST "https://yoursite.com/api/users" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "first_name": "...", "last_name": "...", "email": "...", "user_type": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "User add successful."
}

Delete a User

DELETE/api/users/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number User unique ID
curl -X DELETE "https://yoursite.com/api/users/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "User Deleted Successfully."
}

Get User by ID

GET/api/users/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number User unique ID
curl -X GET "https://yoursite.com/api/users/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "1",
		"first_name": "John",
		"last_name": "Doe",
		"user_type": "staff",
		"is_admin": "1",
		"role_id": "0",
		"email": "john@example.com",
		"image": null,
		"status": "active",
		"client_id": "0",
		"job_title": "Admin",
		"phone": "1234567890",
		"gender": "male",
		"created_at": "2021-09-12 10:00:00"
}

Update a User

PUT/api/users/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number User unique ID
first_name string optional Optional User first name
last_name string optional Optional User last name
email string optional Optional User email
phone string optional Optional User phone
job_title string optional Optional Job title
gender string optional Optional Gender
status string optional Optional Status (active, inactive)
address string optional Optional Address
skype string optional Optional Skype ID
curl -X PUT "https://yoursite.com/api/users/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "User Update Successful."
}

Search Users

GET/api/users/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keyword
curl -X GET "https://yoursite.com/api/users/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "first_name": "John",
    "last_name": "Doe",
    "email": "john@example.com",
    "user_type": "staff",
    "status": "active"
  }
]

Leads

List all Leads

GET/api/leads

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/leads" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "2",
		"company_name": "Test",
		"address": "",
		"city": "",
		"state": "",
		"zip": "",
		"country": "",
		"created_date": "2021-09-12",
		"website": "",
		"phone": "",
		"currency_symbol": "",
		"starred_by": "",
		"group_ids": "",
		"deleted": "0",
		"is_lead": "1",
		"lead_status_id": "1",
		"owner_id": "1",
		"created_by": "1",
		"sort": "0",
		"lead_source_id": "1",
		"last_lead_status": "",
		"client_migration_date": "0000-00-00",
		"vat_number": "",
		"currency": "",
		"disable_online_payment": "0",
		"primary_contact": null,
		"primary_contact_id": null,
		"contact_avatar": null,
		"total_projects": null,
		"payment_received": "0",
		"invoice_value": "0",
		"client_groups": null,
		"lead_status_title": "New",
		"lead_status_color": "#f1c40f",
		"owner_name": "john doe",
		"owner_avatar": null
}

Add New Lead

POST/api/leads

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
company_name string Mandatory Lead Name
owner_id string Mandatory Lead owner id
lead_status_id string Mandatory Lead status id
lead_source_id string Mandatory Lead source id
address string Optional Lead address
city string Optional Lead city
state string Optional Lead state
zip string Optional Lead zip
country string Optional Lead country
phone string Optional Lead phone
website string Optional Lead website
vat_number string Optional Lead vat number
curl -X POST "https://yoursite.com/api/leads" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "company_name": "...", "owner_id": "...", "lead_status_id": "...", "lead_source_id": "...", "address": "...", "city": "...", "state": "...", "zip": "...", "country": "...", "phone": "...", "website": "...", "vat_number": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Lead add successful."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Lead add fail."
}

Delete a Lead

DELETE/api/leads/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number lead unique ID.
curl -X DELETE "https://yoursite.com/api/leads/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Lead Deleted Successfully."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Lead Delete Fail."
}

Get Lead by ID

GET/api/leads/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Lead unique ID
curl -X GET "https://yoursite.com/api/leads/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update a Lead

PUT/api/leads/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number lead unique ID.
company_name string Mandatory Lead Name.
owner_id string Mandatory Lead owner id
lead_status_id string Mandatory Lead status id
lead_source_id string Mandatory Lead source id
address string Optional Lead address
city string Optional Lead city
state string Optional Lead state
zip string Optional Lead zip
country string Optional Lead country
phone string Optional Lead phone
website string Optional Lead website
vat_number string Optional Lead vat number
curl -X PUT "https://yoursite.com/api/leads/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "company_name": "...", "owner_id": "...", "lead_status_id": "...", "lead_source_id": "...", "address": "...", "city": "...", "state": "...", "zip": "...", "country": "...", "phone": "...", "website": "...", "vat_number": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Lead Update Successful."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Lead Update Fail."
}

Search Leads

GET/api/leads/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords
curl -X GET "https://yoursite.com/api/leads/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "2",
		"company_name": "Test",
		"address": "",
		"city": "",
		"state": "",
		"zip": "",
		"country": "",
		"created_date": "2021-09-12",
		"website": "",
		"phone": "",
		"currency_symbol": "",
		"starred_by": "",
		"group_ids": "",
		"deleted": "0",
		"is_lead": "1",
		"lead_status_id": "1",
		"owner_id": "1",
		"created_by": "1",
		"sort": "0",
		"lead_source_id": "1",
		"last_lead_status": "",
		"client_migration_date": "0000-00-00",
		"vat_number": "",
		"currency": "",
		"disable_online_payment": "0",
		"primary_contact": null,
		"primary_contact_id": null,
		"contact_avatar": null,
		"total_projects": null,
		"payment_received": "0",
		"invoice_value": "0",
		"client_groups": null,
		"lead_status_title": "New",
		"lead_status_color": "#f1c40f",
		"owner_name": "john doe",
		"owner_avatar": null
}

Clients

List all Clients

GET/api/clients

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
clientid Number Mandatory Clientid unique ID
curl -X GET "https://yoursite.com/api/clients" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "2",
		"company_name": "jdoe",
		"address": "Rajkot",
		"city": "",
		"state": "",
		"zip": "",
		"country": "",
		"created_date": "2021-09-12",
		"website": "",
		"phone": "",
		"currency_symbol": "INR",
		"starred_by": "",
		"group_ids": "1",
		"deleted": "0",
		"is_lead": "0",
		"lead_status_id": "1",
		"owner_id": "1",
		"created_by": "1",
		"sort": "0",
		"lead_source_id": "1",
		"last_lead_status": "New",
		"client_migration_date": "2021-09-12",
		"vat_number": "",
		"currency": "USD",
		"disable_online_payment": "1",
		"primary_contact": "john doe",
		"primary_contact_id": "4",
		"contact_avatar": null,
		"total_projects": "7",
		"payment_received": "0",
		"invoice_value": "1188",
		"client_groups": "Test c group ",
		"lead_status_title": "New",
		"lead_status_color": "#f1c40f",
		"owner_name": "john doe",
		"owner_avatar": null
}

Add New Client

POST/api/clients

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
company_name string Mandatory Company Name
owner_id string Mandatory Company owner id
group_ids string Optional Company group ids
address string Optional Company address
city string Optional Company city
state string Optional Company state
zip string Optional Company zip
country string Optional Company country
phone string Optional Company phone
website string Optional Company website
vat_number string Optional Company vat number
disable_online_payment string Optional Company disable online payment
curl -X POST "https://yoursite.com/api/clients" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "company_name": "...", "owner_id": "...", "group_ids": "...", "address": "...", "city": "...", "state": "...", "zip": "...", "country": "...", "phone": "...", "website": "...", "vat_number": "...", "disable_online_payment": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Client add successful."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Client add fail."
}

Delete a Client

DELETE/api/clients/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number clients unique ID.
curl -X DELETE "https://yoursite.com/api/clients/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Client Deleted Successfully."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Client Delete Fail."
}

Get Client by ID

GET/api/clients/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/clients/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "2",
  "company_name": "jdoe",
  "address": "Rajkot",
  "city": "",
  "state": "",
  "zip": "",
  "country": "",
  "created_date": "2021-09-12",
  "website": "",
  "phone": "",
  "currency_symbol": "INR",
  "deleted": "0",
  "owner_id": "1"
}

Update a Client

PUT/api/clients/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Client unique ID
company_name string Optional Company Name
owner_id string Optional Company owner id
group_ids string Optional Company group ids
address string Optional Company address
city string Optional Company city
state string Optional Company state
zip string Optional Company zip
country string Optional Company country
phone string Optional Company phone
website string Optional Company website
vat_number string Optional Company vat number
disable_online_payment string Optional Company disable online payment
curl -X PUT "https://yoursite.com/api/clients/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "company_name": "...", "owner_id": "...", "group_ids": "...", "address": "...", "city": "...", "state": "...", "zip": "...", "country": "...", "phone": "...", "website": "...", "vat_number": "...", "disable_online_payment": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Client Update Successful."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Client Update Fail."
}

Search Clients

GET/api/clients/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords
curl -X GET "https://yoursite.com/api/clients/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "2",
		"company_name": "jdoe",
		"address": "Rajkot",
		"city": "",
		"state": "",
		"zip": "",
		"country": "",
		"created_date": "2021-09-12",
		"website": "",
		"phone": "",
		"currency_symbol": "INR",
		"starred_by": "",
		"group_ids": "1",
		"deleted": "0",
		"is_lead": "0",
		"lead_status_id": "1",
		"owner_id": "1",
		"created_by": "1",
		"sort": "0",
		"lead_source_id": "1",
		"last_lead_status": "New",
		"client_migration_date": "2021-09-12",
		"vat_number": "",
		"currency": "USD",
		"disable_online_payment": "1",
		"primary_contact": "john doe",
		"primary_contact_id": "4",
		"contact_avatar": null,
		"total_projects": "7",
		"payment_received": "0",
		"invoice_value": "1188",
		"client_groups": "Test c group ",
		"lead_status_title": "New",
		"lead_status_color": "#f1c40f",
		"owner_name": "john doe",
		"owner_avatar": null
}

Projects

List all Projects

GET/api/projects

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/projects" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "2",
		"title": "project 1",
		"description": "",
		"start_date": null,
		"deadline": null,
		"client_id": "2",
		"created_date": "2021-09-12",
		"created_by": "1",
		"status": "open",
		"starred_by": "",
		"estimate_id": "0",
		"order_id": "0",
		"deleted": "0",
		"company_name": "jdoe",
		"currency_symbol": "INR",
		"total_points": null,
		"completed_points": null
}

Add New Project

POST/api/projects

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title string Mandatory Project Title.
client_id string Mandatory Project client id.
start_date string Mandatory Project Start Date.
description string Optional Project description.
deadline string Optional Project deadline.
created_by number optional Optional RISE user ID. Default: 1. Use for proper attribution.
curl -X POST "https://yoursite.com/api/projects" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "client_id": "...", "start_date": "...", "description": "...", "deadline": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Project add successful."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Project add fail."
}

Delete a Project

DELETE/api/projects/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Project unique ID
curl -X DELETE "https://yoursite.com/api/projects/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Project Deleted Successfully."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Project Delete Fail."
}

Get Project by ID

GET/api/projects/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Project unique ID
curl -X GET "https://yoursite.com/api/projects/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update a Project

PUT/api/projects/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Project unique ID
title string Mandatory Project Title
client_id string Mandatory Project client id
start_date string Mandatory Project Start Date
description string Optional Project description
curl -X PUT "https://yoursite.com/api/projects/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "client_id": "...", "start_date": "...", "description": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Project Update Successful."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Project Update Fail."
}

Search Projects

GET/api/projects/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords
curl -X GET "https://yoursite.com/api/projects/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "2",
		"title": "project 1",
		"description": "",
		"start_date": null,
		"deadline": null,
		"client_id": "2",
		"created_date": "2021-09-12",
		"created_by": "1",
		"status": "open",
		"starred_by": "",
		"estimate_id": "0",
		"order_id": "0",
		"deleted": "0",
		"company_name": "jdoe",
		"currency_symbol": "INR",
		"total_points": null,
		"completed_points": null
}

Tasks

List all Tasks

GET/api/tasks

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
project_id Number optional Optional filter by project ID
status String optional Optional filter by status (to_do, in_progress, done)
assigned_to Number optional Optional filter by assigned user ID
curl -X GET "https://yoursite.com/api/tasks" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "1",
		"title": "Task Title",
		"description": "Task description",
		"project_id": "1",
		"milestone_id": "0",
		"assigned_to": "2",
		"deadline": "2021-12-31 23:59:59",
		"status": "in_progress",
		"priority_id": "1",
		"start_date": "2021-09-01 00:00:00",
		"created_date": "2021-09-01",
		"context": "project"
}

Add New Task

POST/api/tasks

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title string Mandatory Task title
project_id number Mandatory Project ID
assigned_to number Mandatory Assigned user ID
status_id number Mandatory Task status ID
priority_id number Mandatory Task priority ID
description string optional Optional Task description
milestone_id number optional Optional Milestone ID
deadline string optional Optional Deadline (Y-m-d H:i:s)
start_date string optional Optional Start date (Y-m-d H:i:s)
labels string optional Optional Comma-separated label IDs
points number optional Optional Story points (default: 1)
collaborators string optional Optional Comma-separated user IDs
curl -X POST "https://yoursite.com/api/tasks" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "project_id": "...", "assigned_to": "...", "status_id": "...", "priority_id": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Task add successful."
}

Delete a Task

DELETE/api/tasks/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Task unique ID.
curl -X DELETE "https://yoursite.com/api/tasks/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Task Deleted Successfully."
}

Get Task by ID

GET/api/tasks/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Task unique ID
curl -X GET "https://yoursite.com/api/tasks/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "1",
		"title": "Task Title",
		"description": "Task description",
		"project_id": "1",
		"milestone_id": "0",
		"assigned_to": "2",
		"deadline": "2021-12-31 23:59:59",
		"status": "in_progress",
		"priority_id": "1",
		"start_date": "2021-09-01 00:00:00",
		"created_date": "2021-09-01",
		"context": "project"
}

Update a Task

PUT/api/tasks/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Task unique ID
title string optional Optional Task title
description string optional Optional Task description
assigned_to number optional Optional Assigned user ID
status_id number optional Optional Task status ID
priority_id number optional Optional Task priority ID
deadline string optional Optional Deadline
points number optional Optional Story points
curl -X PUT "https://yoursite.com/api/tasks/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Task Update Successful."
}

Search Tasks

GET/api/tasks/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keyword
curl -X GET "https://yoursite.com/api/tasks/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Task Title",
    "project_id": "1",
    "assigned_to": "2",
    "status": "in_progress",
    "priority_id": "1"
  }
]

Milestones

List all Milestones

GET/api/milestones

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
project_id Number optional Optional filter by project ID
curl -X GET "https://yoursite.com/api/milestones" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Phase 1",
    "project_id": "1",
    "due_date": "2024-02-01",
    "description": ""
  }
]

Add New Milestone

POST/api/milestones

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title string Mandatory Milestone title
project_id number Mandatory Project ID
due_date string Mandatory Due date (Y-m-d)
description string optional Optional Milestone description
curl -X POST "https://yoursite.com/api/milestones" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "project_id": "...", "due_date": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Milestone add success"},
  "id": 1
}

Delete a Milestone

DELETE/api/milestones/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/milestones/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Milestone delete success"}
}

Get Milestone by ID

GET/api/milestones/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/milestones/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "title": "Phase 1",
  "project_id": "1",
  "due_date": "2024-02-01",
  "description": ""
}

Update a Milestone

PUT/api/milestones/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Milestone unique ID
title string optional Optional Title to update
due_date string optional Optional Due date to update
description string optional Optional Description to update
curl -X PUT "https://yoursite.com/api/milestones/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Milestone update success"}
}

Search Milestones

GET/api/milestones/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/milestones/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Phase 1"
  }
]

Project Comments

List all Project Comments

GET/api/project-comments

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
project_id Number optional Optional filter by project ID
curl -X GET "https://yoursite.com/api/project-comments" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "project_id": "1",
    "description": "Comment text",
    "created_by": "1"
  }
]

Add Project Comment

POST/api/project-comments

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
project_id number Mandatory Project ID
description string Mandatory Comment content
created_by number optional Optional RISE user ID (commenter). Default: 1. Use for proper attribution.
curl -X POST "https://yoursite.com/api/project-comments" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "project_id": "...", "description": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Comment add success"},
  "id": 1
}

Delete Project Comment

DELETE/api/project-comments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/project-comments/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Comment delete success"}
}

Get Project Comment by ID

GET/api/project-comments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/project-comments/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "project_id": "1",
  "description": "Comment text"
}

Update Project Comment

PUT/api/project-comments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Project comment unique ID
description string optional Optional Comment content to update
curl -X PUT "https://yoursite.com/api/project-comments/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Comment update success"}
}

Search Project Comments

GET/api/project-comments/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/project-comments/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "description": "Comment text"
  }
]

Tickets

List all Tickets

GET/api/tickets

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/tickets" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "client_id": "2",
  "project_id": "0",
  "ticket_type_id": "1",
  "title": "Title",
  "created_by": "1",
  "requested_by": "4",
  "created_at": "2021-09-12 06:47:36",
  "status": "new",
  "last_activity_at": "2021-09-12 06:47:36",
  "assigned_to": "3",
  "creator_name": "",
  "creator_email": "",
  "labels": "9,10",
  "task_id": "0",
  "closed_at": "0000-00-00 00:00:00",
  "deleted": "0",
  "ticket_type": "General Support",
  "company_name": "Company",
  "project_title": null,
  "task_title": null,
 "assigned_to_user": "john doe",
  "assigned_to_avatar": null,
  "labels_list": "9--::--label 2--::--#ad159e,10--::--label 3--::--#29c2c2",
  "requested_by_name": "john doe"
	}

Add New Ticket

POST/api/tickets

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title string Mandatory Ticket title
client_id int Mandatory Ticket client_id
requested_by_id int Mandatory Ticket requested_by_id
ticket_type_id int Mandatory Ticket ticket_type_id
description string Mandatory Ticket description
assigned_to int Mandatory Ticket assigned_to
ticket_labels string Optional Ticket ticket_labels
curl -X POST "https://yoursite.com/api/tickets" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "client_id": "...", "requested_by_id": "...", "ticket_type_id": "...", "description": "...", "assigned_to": "...", "ticket_labels": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Ticket add successful."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Ticket add fail."
}

Delete a Ticket

DELETE/api/tickets/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Ticket unique ID
curl -X DELETE "https://yoursite.com/api/tickets/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Ticket Deleted Successfuly."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Ticket Delete Fail."
}

Get Ticket by ID

GET/api/tickets/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Ticket unique ID
curl -X GET "https://yoursite.com/api/tickets/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update a Ticket

PUT/api/tickets/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Ticket unique ID
title string Mandatory Ticket title
client_id int Mandatory Ticket client_id
requested_by_id int Mandatory Ticket requested_by_id
ticket_type_id int Mandatory Ticket ticket_type_id
assigned_to int Mandatory Ticket assigned_to
ticket_labels string Optional Ticket ticket_labels
curl -X PUT "https://yoursite.com/api/tickets/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "client_id": "...", "requested_by_id": "...", "ticket_type_id": "...", "assigned_to": "...", "ticket_labels": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Ticket update successful."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Ticket update fail."
}

Search Tickets

GET/api/tickets/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords
curl -X GET "https://yoursite.com/api/tickets/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "client_id": "2",
  "project_id": "0",
  "ticket_type_id": "1",
  "title": "Title",
  "created_by": "1",
  "requested_by": "4",
  "created_at": "2021-09-12 06:47:36",
  "status": "new",
  "last_activity_at": "2021-09-12 06:47:36",
  "assigned_to": "3",
  "creator_name": "",
  "creator_email": "",
  "labels": "9,10",
  "task_id": "0",
  "closed_at": "0000-00-00 00:00:00",
  "deleted": "0",
  "ticket_type": "General Support",
  "company_name": "Company",
  "project_title": null,
  "task_title": null,
 "assigned_to_user": "john doe",
  "assigned_to_avatar": null,
  "labels_list": "9--::--label 2--::--#ad159e,10--::--label 3--::--#29c2c2",
  "requested_by_name": "john doe"
	}

Ticket Comments

List all Ticket Comments

GET/api/ticket-comments

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
ticket_id Number optional Optional filter by ticket ID
curl -X GET "https://yoursite.com/api/ticket-comments" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "ticket_id": "1",
    "description": "Comment text",
    "created_by": "1"
  }
]

Add Ticket Comment

POST/api/ticket-comments

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
ticket_id number Mandatory Ticket ID
description string Mandatory Comment content
created_by number optional Optional RISE user ID (commenter). Default: 1. Use for proper attribution.
curl -X POST "https://yoursite.com/api/ticket-comments" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "ticket_id": "...", "description": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Comment add success"},
  "id": 1
}

Delete Ticket Comment

DELETE/api/ticket-comments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/ticket-comments/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Comment delete success"}
}

Get Ticket Comment by ID

GET/api/ticket-comments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/ticket-comments/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "ticket_id": "1",
  "description": "Comment text"
}

Update Ticket Comment

PUT/api/ticket-comments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Ticket comment unique ID
description string optional Optional Comment content to update
curl -X PUT "https://yoursite.com/api/ticket-comments/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Comment update success"}
}

Search Ticket Comments

GET/api/ticket-comments/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/ticket-comments/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "description": "Comment text"
  }
]

Invoices

List all Invoices

GET/api/invoices

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/invoices" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

 {
  "id": "1",
  "client_id": "2",
  "project_id": "1",
  "bill_date": "2021-09-12",
  "due_date": "2021-10-01",
  "note": "",
  "labels": "",
  "last_email_sent_date": "2021-09-12",
  "status": "not_paid",
  "tax_id": "1",
  "tax_id2": "1",
  "tax_id3": "0",
  "recurring": "0",
  "recurring_invoice_id": "0",
  "repeat_every": "1",
  "repeat_type": "months",
  "no_of_cycles": "0",
  "next_recurring_date": null,
  "no_of_cycles_completed": "0",
  "due_reminder_date": null,
  "recurring_reminder_date": null,
  "discount_amount": "1",
  "discount_amount_type": "percentage",
  "discount_type": "after_tax",
  "cancelled_at": null,
  "cancelled_by": "0",
  "files": "a:0:{}",
  "deleted": "0",
  "currency": "USD",
  "currency_symbol": "INR",
  "company_name": "Company",
  "project_title": "project 1",
  "invoice_value": "1188",
  "payment_received": "0",
  "tax_percentage": "10",
  "tax_percentage2": "10",
  "tax_percentage3": null,
  "cancelled_by_user": null,
  "labels_list": null
}

Add an Invoice

POST/api/invoices

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
invoice_bill_date string Optional invoice bill date
invoice_due_date string Mandatory invoice due date
invoice_client_id string Mandatory invoice client id
invoice_project_id string Optional invoice project id
tax_id string Optional invoice tax id
tax_id2 string Optional invoice tax id2
tax_id3 string Optional invoice tax id3
recurring string Optional invoice recurring
invoice_note string Optional invoice note
labels string Optional invoice labels
items Object[] optional Optional invoice lines, in the same shape GET /api/invoices/:id/items returns. Omit the key to keep the previous behaviour of creating a header with no lines. An empty array is rejected with a 400.
items.title String Mandatory line title. A description is accepted instead.
items.description String optional Optional line description
items.quantity Number Mandatory quantity, numeric
items.rate Number Mandatory unit rate, numeric
items.unit_type String optional Optional unit type, maximum 20 characters
items.sort Number optional Optional display order. Defaults to the array position.
items.item_id Number optional Optional items library ID
items.taxable Number optional Optional, 1 (default) or 0
curl -X POST "https://yoursite.com/api/invoices" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "invoice_bill_date": "...", "invoice_due_date": "...", "invoice_client_id": "...", "invoice_project_id": "...", "tax_id": "...", "tax_id2": "...", "tax_id3": "...", "recurring": "...", "invoice_note": "...", "labels": "...", "items.title": "...", "items.quantity": "...", "items.rate": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Invoice add successful."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Invoice add fail."
}

Delete an Invoice

DELETE/api/invoices/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Invoice unique ID
curl -X DELETE "https://yoursite.com/api/invoices/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Invoice Delete Successfuly."
}


HTTP/1.1 404 Not Found
{
  "status": false,
  "message": "Invoice Delete Fail."
}

Get Invoice by ID

GET/api/invoices/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Invoice unique ID
curl -X GET "https://yoursite.com/api/invoices/123" \
  -H "authtoken: YOUR_API_TOKEN"

Edit an Invoice

PUT/api/invoices/{id}

Parameters

FieldTypeDescription
id Number Invoice unique ID
invoice_bill_date string Optional Invoice Bill Date
invoice_due_date string Mandatory Invoice Due Date
invoice_client_id string Mandatory Invoice Client id
invoice_project_id string Optional Invoice Project id
tax_id string Optional Invoice Tax id
tax_id2 string Optional Invoice Tax id2
tax_id3 string Optional Invoice Tax id3
recurring string Optional Invoice Recurring
invoice_note string Optional Invoice note
labels string Optional Invoice Label
items Object[] optional Optional replacement invoice lines, in the same shape GET /api/invoices/:id/items returns. When present the existing lines are replaced and the totals recalculated; when absent the lines are left untouched. An empty array is rejected with a 400 instead of clearing the invoice.
items.title String Mandatory line title. A description is accepted instead.
items.description String optional Optional line description
items.quantity Number Mandatory quantity, numeric
items.rate Number Mandatory unit rate, numeric
items.unit_type String optional Optional unit type, maximum 20 characters
items.sort Number optional Optional display order. Defaults to the array position.
items.item_id Number optional Optional items library ID
items.taxable Number optional Optional, 1 (default) or 0
curl -X PUT "https://yoursite.com/api/invoices/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "invoice_bill_date": "...", "invoice_due_date": "...", "invoice_client_id": "...", "invoice_project_id": "...", "tax_id": "...", "tax_id2": "...", "tax_id3": "...", "recurring": "...", "invoice_note": "...", "labels": "...", "items.title": "...", "items.quantity": "...", "items.rate": "..." }'

Success-Response:

		HTTP/1.1 200 OK
		{
		  "status": true,
		  "message": "Invoice Update Successful."
		}


   HTTP/1.1 404 Not Found
   {
     "status": false,
     "message": "Invoice Update Fail."
   }

Search Invoices

GET/api/invoices/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords
curl -X GET "https://yoursite.com/api/invoices/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

 {
  "id": "1",
  "client_id": "2",
  "project_id": "1",
  "bill_date": "2021-09-12",
  "due_date": "2021-10-01",
  "note": "",
  "labels": "",
  "last_email_sent_date": "2021-09-12",
  "status": "not_paid",
  "tax_id": "1",
  "tax_id2": "1",
  "tax_id3": "0",
  "recurring": "0",
  "recurring_invoice_id": "0",
  "repeat_every": "1",
  "repeat_type": "months",
  "no_of_cycles": "0",
  "next_recurring_date": null,
  "no_of_cycles_completed": "0",
  "due_reminder_date": null,
  "recurring_reminder_date": null,
  "discount_amount": "1",
  "discount_amount_type": "percentage",
  "discount_type": "after_tax",
  "cancelled_at": null,
  "cancelled_by": "0",
  "files": "a:0:{}",
  "deleted": "0",
  "currency": "USD",
  "currency_symbol": "INR",
  "company_name": "Company",
  "project_title": "project 1",
  "invoice_value": "1188",
  "payment_received": "0",
  "tax_percentage": "10",
  "tax_percentage2": "10",
  "tax_percentage3": null,
  "cancelled_by_user": null,
  "labels_list": null
}

Invoice Payments

List all Invoice Payments

GET/api/invoice-payments

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
invoice_id Number optional Optional filter by invoice ID
curl -X GET "https://yoursite.com/api/invoice-payments" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "invoice_id": "1",
    "amount": "100.00",
    "payment_date": "2024-01-15",
    "payment_method_id": "1"
  }
]

Add Invoice Payment

POST/api/invoice-payments

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
invoice_id number Mandatory Invoice ID
amount number Mandatory Payment amount
payment_date string Mandatory Payment date (Y-m-d)
payment_method_id number optional Optional Payment method ID
note string optional Optional Payment note
created_by number optional Optional RISE user ID. Default: 1. Use for proper attribution.
curl -X POST "https://yoursite.com/api/invoice-payments" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "invoice_id": "...", "amount": "...", "payment_date": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Payment add success"},
  "id": 1
}

Delete Invoice Payment

DELETE/api/invoice-payments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/invoice-payments/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Payment delete success"}
}

Get Invoice Payment by ID

GET/api/invoice-payments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/invoice-payments/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "invoice_id": "1",
  "amount": "100.00",
  "payment_date": "2024-01-15"
}

Update Invoice Payment

PUT/api/invoice-payments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Payment unique ID
amount number optional Optional Amount to update
payment_date string optional Optional Payment date to update
note string optional Optional Note to update
curl -X PUT "https://yoursite.com/api/invoice-payments/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Payment update success"}
}

Search Invoice Payments

GET/api/invoice-payments/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/invoice-payments/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "invoice_id": "1",
    "amount": "100.00"
  }
]

Expenses

List all Expenses

GET/api/expenses

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
project_id Number optional Optional filter by project ID
category_id Number optional Optional filter by category ID
user_id Number optional Optional filter by user ID
curl -X GET "https://yoursite.com/api/expenses" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "1",
		"expense_date": "2021-09-15",
		"category_id": "1",
		"description": "Office supplies",
		"amount": "250.00",
		"title": "Monthly Office Expenses",
		"project_id": "1",
		"user_id": "2",
		"tax_id": "1",
		"client_id": "1"
}

Add New Expense

POST/api/expenses

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
expense_date string Mandatory Expense date (Y-m-d)
category_id number Mandatory Category ID
title string Mandatory Expense title
amount number Mandatory Expense amount
description string optional Optional Expense description
project_id number optional Optional Project ID
user_id number optional Optional User ID
client_id number optional Optional Client ID
tax_id number optional Optional Tax ID
tax_id2 number optional Optional Second tax ID
created_by number optional Optional RISE user ID. Default: 1. Use for proper attribution.
curl -X POST "https://yoursite.com/api/expenses" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "expense_date": "...", "category_id": "...", "title": "...", "amount": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Expense add successful."
}

Delete an Expense

DELETE/api/expenses/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Expense unique ID
curl -X DELETE "https://yoursite.com/api/expenses/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Expense Deleted Successfully."
}

Get Expense by ID

GET/api/expenses/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Expense unique ID
curl -X GET "https://yoursite.com/api/expenses/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "1",
		"expense_date": "2021-09-15",
		"category_id": "1",
		"description": "Office supplies",
		"amount": "250.00",
		"title": "Monthly Office Expenses",
		"project_id": "1",
		"user_id": "2",
		"tax_id": "1",
		"client_id": "1"
}

Update an Expense

PUT/api/expenses/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Expense unique ID
expense_date string optional Optional Expense date
category_id number optional Optional Category ID
title string optional Optional Expense title
amount number optional Optional Expense amount
description string optional Optional Expense description
curl -X PUT "https://yoursite.com/api/expenses/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Expense Update Successful."
}

Search Expenses

GET/api/expenses/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keyword
curl -X GET "https://yoursite.com/api/expenses/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Office Supplies",
    "amount": "250.00",
    "expense_date": "2021-09-15",
    "category_id": "1"
  }
]

Estimates

List all Estimates

GET/api/estimates

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
client_id Number optional Optional filter by client ID
status String optional Optional filter by status (draft, sent, accepted, declined)
curl -X GET "https://yoursite.com/api/estimates" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "1",
		"client_id": "2",
		"estimate_date": "2021-09-15",
		"valid_until": "2021-10-15",
		"status": "sent",
		"note": "Estimate for new project",
		"tax_id": "1",
		"tax_id2": "0",
		"discount_amount": "10",
		"discount_amount_type": "percentage",
		"project_id": "1"
}

Add New Estimate

POST/api/estimates

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
client_id number Mandatory Client ID
estimate_date string Mandatory Estimate date (Y-m-d)
valid_until string Mandatory Valid until date (Y-m-d)
status string optional Optional Status (draft, sent, accepted, declined) default: draft
note string optional Optional Estimate note
project_id number optional Optional Project ID
tax_id number optional Optional Tax ID
tax_id2 number optional Optional Second tax ID
discount_amount number optional Optional Discount amount
discount_amount_type string optional Optional Discount type (percentage, fixed_amount)
created_by number optional Optional RISE user ID. Default: 1. Use for proper attribution.
items Object[] optional Optional estimate lines, in the same shape GET /api/estimates/:id/items returns. Omit the key to keep the previous behaviour of creating a header with no lines. An empty array is rejected with a 400.
items.title String Mandatory line title. A description is accepted instead.
items.description String optional Optional line description
items.quantity Number Mandatory quantity, numeric
items.rate Number Mandatory unit rate, numeric
items.unit_type String optional Optional unit type, maximum 20 characters
items.sort Number optional Optional display order. Defaults to the array position.
items.item_id Number optional Optional items library ID
curl -X POST "https://yoursite.com/api/estimates" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "client_id": "...", "estimate_date": "...", "valid_until": "...", "items.title": "...", "items.quantity": "...", "items.rate": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Estimate add successful."
}

Delete an Estimate

DELETE/api/estimates/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Estimate unique ID
curl -X DELETE "https://yoursite.com/api/estimates/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Estimate Deleted Successfully."
}

Get Estimate by ID

GET/api/estimates/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Estimate unique ID
curl -X GET "https://yoursite.com/api/estimates/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "1",
		"client_id": "2",
		"estimate_date": "2021-09-15",
		"valid_until": "2021-10-15",
		"status": "sent",
		"note": "Estimate for new project",
		"tax_id": "1",
		"tax_id2": "0",
		"discount_amount": "10",
		"discount_amount_type": "percentage",
		"project_id": "1"
}

Update an Estimate

PUT/api/estimates/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Estimate unique ID
client_id number optional Optional Client ID to update
estimate_date string optional Optional Estimate date to update
valid_until string optional Optional Valid until date to update
status string optional Optional Status to update
note string optional Optional Note to update
project_id number optional Optional Project ID to update
tax_id number optional Optional Tax ID to update
discount_amount number optional Optional Discount amount to update
items Object[] optional Optional replacement estimate lines, in the same shape GET /api/estimates/:id/items returns. When present the existing lines are replaced; when absent the lines are left untouched. An empty array is rejected with a 400 instead of clearing the estimate.
items.title String Mandatory line title. A description is accepted instead.
items.description String optional Optional line description
items.quantity Number Mandatory quantity, numeric
items.rate Number Mandatory unit rate, numeric
items.unit_type String optional Optional unit type, maximum 20 characters
items.sort Number optional Optional display order. Defaults to the array position.
items.item_id Number optional Optional items library ID
curl -X PUT "https://yoursite.com/api/estimates/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "items.title": "...", "items.quantity": "...", "items.rate": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Estimate Update Successful."
}

Search Estimates

GET/api/estimates/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keyword
curl -X GET "https://yoursite.com/api/estimates/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "client_id": "2",
    "estimate_date": "2021-09-15",
    "status": "sent",
    "note": "Estimate for project"
  }
]

Estimate Requests

List all Estimate Requests

GET/api/estimate-requests

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/estimate-requests" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  { "id": "1", "estimate_form_id": "2", "client_id": "5", "assigned_to": "3", "status": "new", "form_title": "Website Estimate", "deleted": "0" }
]

Add New Estimate Request

POST/api/estimate-requests

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
estimate_form_id Number Mandatory Estimate form ID
client_id Number optional Optional Client ID
assigned_to Number optional Optional Assigned to user ID
status String optional Optional Status (new, processing, estimated, hold, canceled)
curl -X POST "https://yoursite.com/api/estimate-requests" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "estimate_form_id": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "Record saved"}, "id": 1 }

Delete an Estimate Request

DELETE/api/estimate-requests/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Estimate Request unique ID
curl -X DELETE "https://yoursite.com/api/estimate-requests/123" \
  -H "authtoken: YOUR_API_TOKEN"

Get Estimate Request by ID

GET/api/estimate-requests/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Estimate Request unique ID
curl -X GET "https://yoursite.com/api/estimate-requests/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update an Estimate Request

PUT/api/estimate-requests/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Estimate Request unique ID
estimate_form_id Number optional Optional Estimate form ID
client_id Number optional Optional Client ID
assigned_to Number optional Optional Assigned to user ID
status String optional Optional Status
curl -X PUT "https://yoursite.com/api/estimate-requests/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Search Estimate Requests

GET/api/estimate-requests/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords
curl -X GET "https://yoursite.com/api/estimate-requests/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Taxes

List all Taxes

GET/api/taxes

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/taxes" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  { "id": "1", "title": "Tax (10%)", "percentage": "10", "deleted": "0" }
]

Add New Tax

POST/api/taxes

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title String Mandatory Tax title
percentage Number Mandatory Tax percentage
curl -X POST "https://yoursite.com/api/taxes" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "percentage": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "Record saved"}, "id": 1 }

Delete a Tax

DELETE/api/taxes/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Tax unique ID
curl -X DELETE "https://yoursite.com/api/taxes/123" \
  -H "authtoken: YOUR_API_TOKEN"

Get Tax by ID

GET/api/taxes/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Tax unique ID
curl -X GET "https://yoursite.com/api/taxes/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update a Tax

PUT/api/taxes/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Tax unique ID
title String optional Optional Title
percentage Number optional Optional Percentage
curl -X PUT "https://yoursite.com/api/taxes/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Search Taxes

GET/api/taxes/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords
curl -X GET "https://yoursite.com/api/taxes/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Items

List all Items

GET/api/items

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/items" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": "1",
    "title": "Website Design",
    "description": "Full website design package",
    "category_id": "1",
    "unit_type": "hours",
    "rate": "150.00",
    "show_in_client_portal": "1",
    "deleted": "0",
    "category_title": "Services"
  }
]

Add New Item

POST/api/items

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
category_id Number Mandatory Item category ID
title String optional Optional Item title
description String optional Optional Item description
unit_type String optional Optional Unit type
rate Number optional Optional Item rate
show_in_client_portal Number optional Optional Show in client portal (1 or 0)
created_by Number optional Optional RISE user ID. Default: 1. Use for proper attribution.
curl -X POST "https://yoursite.com/api/items" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "category_id": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "Record saved"}, "id": 1 }

Delete an Item

DELETE/api/items/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Item unique ID
curl -X DELETE "https://yoursite.com/api/items/123" \
  -H "authtoken: YOUR_API_TOKEN"

Get Item by ID

GET/api/items/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Item unique ID
curl -X GET "https://yoursite.com/api/items/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update an Item

PUT/api/items/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Item unique ID
title String optional Optional Title
description String optional Optional Description
category_id Number optional Optional Category ID
unit_type String optional Optional Unit type
rate Number optional Optional Rate
show_in_client_portal Number optional Optional Show in client portal (1 or 0)
curl -X PUT "https://yoursite.com/api/items/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Search Items

GET/api/items/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords
curl -X GET "https://yoursite.com/api/items/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Item Categories

List all Item Categories

GET/api/item-categories

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/item-categories" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  { "id": "1", "title": "Hardware", "deleted": "0" }
]

Add New Item Category

POST/api/item-categories

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title String Mandatory Item Category title
curl -X POST "https://yoursite.com/api/item-categories" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "Record saved"}, "id": 1 }

Delete an Item Category

DELETE/api/item-categories/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Item Category unique ID
curl -X DELETE "https://yoursite.com/api/item-categories/123" \
  -H "authtoken: YOUR_API_TOKEN"

Get Item Category by ID

GET/api/item-categories/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Item Category unique ID
curl -X GET "https://yoursite.com/api/item-categories/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update an Item Category

PUT/api/item-categories/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Item Category unique ID
title String optional Optional Title
curl -X PUT "https://yoursite.com/api/item-categories/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Search Item Categories

GET/api/item-categories/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords
curl -X GET "https://yoursite.com/api/item-categories/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Contacts

List all Contacts

GET/api/contacts

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/contacts" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": "6",
    "first_name": "Fname",
    "last_name": "Lname",
    "user_type": "client",
    "email": "contact@example.com",
    "client_id": "3",
    "is_primary_contact": "0",
    "job_title": "HR",
    "phone": "1234567890",
    "gender": "male",
    "status": "active",
    "created_at": "2021-09-18 11:26:56",
    "deleted": "0"
  }
]

Add New Contact

POST/api/contacts

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
first_name String Mandatory First name
last_name String Mandatory Last name
email String Mandatory valid email
client_id Number Mandatory existing client ID
login_password String optional Optional login password (will be hashed)
phone String optional Optional phone
job_title String optional Optional job title
gender String optional Optional gender
note String optional Optional note
curl -X POST "https://yoursite.com/api/contacts" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "first_name": "...", "last_name": "...", "email": "...", "client_id": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "Record saved"}, "id": 1 }

Delete a Contact

DELETE/api/contacts/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Contact unique ID
curl -X DELETE "https://yoursite.com/api/contacts/123" \
  -H "authtoken: YOUR_API_TOKEN"

Get Contact by ID

GET/api/contacts/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Contact unique ID
curl -X GET "https://yoursite.com/api/contacts/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "id": "6",
  "first_name": "Fname",
  "last_name": "Lname",
  "user_type": "client",
  "email": "contact@example.com",
  "client_id": "3",
  "is_primary_contact": "0",
  "job_title": "HR",
  "phone": "1234567890",
  "gender": "male",
  "status": "active",
  "created_at": "2021-09-18 11:26:56",
  "deleted": "0"
}

Update a Contact

PUT/api/contacts/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Contact unique ID
first_name String optional Optional First name
last_name String optional Optional Last name
email String optional Optional valid email
login_password String optional Optional login password (will be hashed)
phone String optional Optional phone
job_title String optional Optional job title
gender String optional Optional gender
note String optional Optional note
curl -X PUT "https://yoursite.com/api/contacts/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Search Contacts

GET/api/contacts/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords (matches name or email)
curl -X GET "https://yoursite.com/api/contacts/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Subscriptions

List all Subscriptions

GET/api/subscriptions

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/subscriptions" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  { "id": "1", "title": "Monthly Plan", "type": "app", "client_id": "2", "repeat_every": "1", "repeat_type": "months", "deleted": "0" }
]

Add New Subscription

POST/api/subscriptions

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
subscription_client_id Number Mandatory Client ID
repeat_type String Mandatory Repeat type (days, weeks, months, years)
title String optional Optional Subscription title
type String optional Optional Subscription type
subscription_bill_date String optional Optional Bill date
tax_id Number optional Optional Tax ID
tax_id2 Number optional Optional Second Tax ID
company_id Number optional Optional Company ID
repeat_every Number optional Optional Repeat every (default 1)
subscription_note String optional Optional Note
labels String optional Optional Labels
curl -X POST "https://yoursite.com/api/subscriptions" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "subscription_client_id": "...", "repeat_type": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "Record saved"}, "id": 1 }

Delete a Subscription

DELETE/api/subscriptions/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Subscription unique ID
curl -X DELETE "https://yoursite.com/api/subscriptions/123" \
  -H "authtoken: YOUR_API_TOKEN"

Get Subscription by ID

GET/api/subscriptions/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Subscription unique ID
curl -X GET "https://yoursite.com/api/subscriptions/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update a Subscription

PUT/api/subscriptions/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Subscription unique ID
title String optional Optional Title
type String optional Optional Type
subscription_client_id Number optional Optional Client ID
subscription_bill_date String optional Optional Bill date
tax_id Number optional Optional Tax ID
tax_id2 Number optional Optional Second Tax ID
company_id Number optional Optional Company ID
repeat_every Number optional Optional Repeat every
repeat_type String optional Optional Repeat type
subscription_note String optional Optional Note
labels String optional Optional Labels
curl -X PUT "https://yoursite.com/api/subscriptions/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Search Subscriptions

GET/api/subscriptions/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords
curl -X GET "https://yoursite.com/api/subscriptions/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Timesheets

List all Timesheets

GET/api/timesheets

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/timesheets" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": "1",
    "project_id": "1",
    "user_id": "2",
    "task_id": "0",
    "start_time": "2026-06-22 09:00:00",
    "end_time": "2026-06-22 10:30:00",
    "hours": "0",
    "note": "Worked on API",
    "status": "logged"
  }
]

Add New Timesheet

POST/api/timesheets

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
project_id Number Mandatory Project ID
user_id Number Mandatory User ID
task_id Number optional Optional Task ID
start_time String optional Optional Start time (Y-m-d H:i:s)
end_time String optional Optional End time (Y-m-d H:i:s)
hours Number optional Optional Manually logged hours (default: 0)
note String optional Optional Note
curl -X POST "https://yoursite.com/api/timesheets" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "project_id": "...", "user_id": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "Record saved"}, "id": 1 }

Delete a Timesheet

DELETE/api/timesheets/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Timesheet unique ID
curl -X DELETE "https://yoursite.com/api/timesheets/123" \
  -H "authtoken: YOUR_API_TOKEN"

Get Timesheet by ID

GET/api/timesheets/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Timesheet unique ID
curl -X GET "https://yoursite.com/api/timesheets/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update a Timesheet

PUT/api/timesheets/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Timesheet unique ID
project_id Number optional Optional Project ID
user_id Number optional Optional User ID
task_id Number optional Optional Task ID
start_time String optional Optional Start time (Y-m-d H:i:s)
end_time String optional Optional End time (Y-m-d H:i:s)
hours Number optional Optional Manually logged hours
note String optional Optional Note
curl -X PUT "https://yoursite.com/api/timesheets/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Search Timesheets

GET/api/timesheets/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords
curl -X GET "https://yoursite.com/api/timesheets/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Expense Categories

List all Expense Categories

GET/api/expense-categories

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/expense-categories" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  { "id": "1", "title": "Travel", "deleted": "0" }
]

Add New Expense Category

POST/api/expense-categories

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title String Mandatory Expense Category title
curl -X POST "https://yoursite.com/api/expense-categories" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "Record saved"}, "id": 1 }

Delete an Expense Category

DELETE/api/expense-categories/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Expense Category unique ID
curl -X DELETE "https://yoursite.com/api/expense-categories/123" \
  -H "authtoken: YOUR_API_TOKEN"

Get Expense Category by ID

GET/api/expense-categories/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Expense Category unique ID
curl -X GET "https://yoursite.com/api/expense-categories/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update an Expense Category

PUT/api/expense-categories/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Expense Category unique ID
title String optional Optional Title
curl -X PUT "https://yoursite.com/api/expense-categories/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Search Expense Categories

GET/api/expense-categories/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords
curl -X GET "https://yoursite.com/api/expense-categories/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Labels

List all Labels

GET/api/labels

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
context String optional Optional filter by context (project|invoice|ticket|task|client|lead|event|note|to_do|subscription|...)
curl -X GET "https://yoursite.com/api/labels" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  { "id": "1", "title": "Hourly Project", "color": "#83c340", "context": "project", "user_id": "0", "deleted": "0" }
]

Add New Label

POST/api/labels

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title String Mandatory Label title
context String Mandatory Label context (project|invoice|ticket|task|client|lead|event|note|to_do|subscription|...)
color String optional Optional Label color as a hex value (e.g. #83c340)
user_id Number optional Optional owning user id (used for personal contexts such as event|note|to_do); defaults to 0
curl -X POST "https://yoursite.com/api/labels" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "context": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "Record saved"}, "id": 1 }

Delete a Label

DELETE/api/labels/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Label unique ID
curl -X DELETE "https://yoursite.com/api/labels/123" \
  -H "authtoken: YOUR_API_TOKEN"

Get Label by ID

GET/api/labels/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Label unique ID
curl -X GET "https://yoursite.com/api/labels/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update a Label

PUT/api/labels/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Label unique ID
title String optional Optional Title
context String optional Optional context (project|invoice|ticket|task|client|lead|event|note|to_do|subscription|...)
color String optional Optional color as a hex value (e.g. #83c340)
user_id Number optional Optional owning user id
curl -X PUT "https://yoursite.com/api/labels/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Search Labels

GET/api/labels/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords
curl -X GET "https://yoursite.com/api/labels/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Proposals

List all Proposals

GET/api/proposals

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
client_id Number optional Optional filter by client ID
status String optional Optional filter by status (draft, sent, accepted, declined)
curl -X GET "https://yoursite.com/api/proposals" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "1",
		"client_id": "2",
		"proposal_date": "2021-09-15",
		"valid_until": "2021-10-15",
		"status": "sent",
		"note": "Proposal for new project",
		"tax_id": "1",
		"project_id": "1",
		"discount_amount": "5",
		"discount_amount_type": "percentage"
}

Add New Proposal

POST/api/proposals

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
client_id number Mandatory Client ID
proposal_date string Mandatory Proposal date (Y-m-d)
valid_until string Mandatory Valid until date (Y-m-d)
status string optional Optional Status (draft, sent, accepted, declined) default: draft
note string optional Optional Proposal note
content string optional Optional Proposal content
project_id number optional Optional Project ID
tax_id number optional Optional Tax ID
tax_id2 number optional Optional Second tax ID
discount_amount number optional Optional Discount amount
discount_amount_type string optional Optional Discount type (percentage, fixed_amount)
created_by number optional Optional RISE user ID. Default: 1. Use for proper attribution.
items Object[] optional Optional proposal lines, in the same shape GET /api/proposals/:id/items returns. Omit the key to keep the previous behaviour of creating a header with no lines. An empty array is rejected with a 400.
items.title String Mandatory line title. A description is accepted instead.
items.description String optional Optional line description
items.quantity Number Mandatory quantity, numeric
items.rate Number Mandatory unit rate, numeric
items.unit_type String optional Optional unit type, maximum 20 characters
items.sort Number optional Optional display order. Defaults to the array position.
items.item_id Number optional Optional items library ID
curl -X POST "https://yoursite.com/api/proposals" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "client_id": "...", "proposal_date": "...", "valid_until": "...", "items.title": "...", "items.quantity": "...", "items.rate": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "message": "Proposal add successful."
}

Delete a Proposal

DELETE/api/proposals/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Proposal unique ID.
curl -X DELETE "https://yoursite.com/api/proposals/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Proposal Deleted Successfully."}
}

Get Proposal by ID

GET/api/proposals/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Proposal unique ID
curl -X GET "https://yoursite.com/api/proposals/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
		"id": "1",
		"client_id": "2",
		"proposal_date": "2021-09-15",
		"valid_until": "2021-10-15",
		"status": "sent",
		"note": "Proposal for new project",
		"tax_id": "1",
		"project_id": "1",
		"discount_amount": "5",
		"discount_amount_type": "percentage"
}

Update a Proposal

PUT/api/proposals/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Proposal unique ID
proposal_date string optional Optional Proposal date to update
valid_until string optional Optional Valid until date to update
status string optional Optional Status to update
note string optional Optional Note to update
content string optional Optional Content to update
discount_amount number optional Optional Discount amount to update
items Object[] optional Optional replacement proposal lines, in the same shape GET /api/proposals/:id/items returns. When present the existing lines are replaced; when absent the lines are left untouched. An empty array is rejected with a 400 instead of clearing the proposal.
items.title String Mandatory line title. A description is accepted instead.
items.description String optional Optional line description
items.quantity Number Mandatory quantity, numeric
items.rate Number Mandatory unit rate, numeric
items.unit_type String optional Optional unit type, maximum 20 characters
items.sort Number optional Optional display order. Defaults to the array position.
items.item_id Number optional Optional items library ID
curl -X PUT "https://yoursite.com/api/proposals/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "items.title": "...", "items.quantity": "...", "items.rate": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Proposal Update Successful."}
}

Search Proposals

GET/api/proposals/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keyword
curl -X GET "https://yoursite.com/api/proposals/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "client_id": "2",
    "proposal_date": "2021-09-15",
    "status": "sent",
    "note": "Proposal for new project"
  }
]

Orders

List all Orders

GET/api/orders

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
client_id Number optional Optional filter by client ID
status_id Number optional Optional filter by status ID
curl -X GET "https://yoursite.com/api/orders" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "client_id": "2",
    "order_date": "2024-01-15",
    "status_id": "1",
    "note": "",
    "project_id": "0",
    "discount_amount": "0"
  }
]

Add New Order

POST/api/orders

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
client_id number Mandatory Client ID
order_date string Mandatory Order date (Y-m-d)
status_id number Mandatory Status ID
note string optional Optional Order note
project_id number optional Optional Project ID
discount_amount number optional Optional Discount amount
created_by number optional Optional RISE user ID. Default: 1. Use for proper attribution.
items Object[] optional Optional order lines, in the same shape GET /api/orders/:id/items returns. Omit the key to keep the previous behaviour of creating a header with no lines. An empty array is rejected with a 400.
items.title String Mandatory line title. A description is accepted instead.
items.description String optional Optional line description
items.quantity Number Mandatory quantity, numeric
items.rate Number Mandatory unit rate, numeric
items.unit_type String optional Optional unit type, maximum 20 characters
items.sort Number optional Optional display order. Defaults to the array position.
items.item_id Number optional Optional items library ID
curl -X POST "https://yoursite.com/api/orders" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "client_id": "...", "order_date": "...", "status_id": "...", "items.title": "...", "items.quantity": "...", "items.rate": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Order add success"},
  "id": 1
}

Delete an Order

DELETE/api/orders/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/orders/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Order delete success"}
}

Get Order by ID

GET/api/orders/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/orders/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "client_id": "2",
  "order_date": "2024-01-15",
  "status_id": "1",
  "note": "",
  "project_id": "0"
}

Update an Order

PUT/api/orders/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Order unique ID
order_date string optional Optional Order date to update
status_id number optional Optional Status ID to update
note string optional Optional Note to update
items Object[] optional Optional replacement order lines, in the same shape GET /api/orders/:id/items returns. When present the existing lines are replaced; when absent the lines are left untouched. An empty array is rejected with a 400 instead of clearing the order.
items.title String Mandatory line title. A description is accepted instead.
items.description String optional Optional line description
items.quantity Number Mandatory quantity, numeric
items.rate Number Mandatory unit rate, numeric
items.unit_type String optional Optional unit type, maximum 20 characters
items.sort Number optional Optional display order. Defaults to the array position.
items.item_id Number optional Optional items library ID
curl -X PUT "https://yoursite.com/api/orders/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "items.title": "...", "items.quantity": "...", "items.rate": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Order update success"}
}

Search Orders

GET/api/orders/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/orders/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Order #1"
  }
]

Contracts

List all Contracts

GET/api/contracts

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
client_id Number optional Optional filter by client ID
status String optional Optional filter by status (draft, sent, accepted, declined)
curl -X GET "https://yoursite.com/api/contracts" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Contract A",
    "client_id": "2",
    "project_id": "1",
    "contract_date": "2024-01-15",
    "valid_until": "2024-12-31",
    "status": "sent"
  }
]

Add New Contract

POST/api/contracts

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title string Mandatory Contract title
client_id number Mandatory Client ID
project_id number Mandatory Project ID
contract_date string Mandatory Contract date (Y-m-d)
valid_until string Mandatory Valid until date (Y-m-d)
status string optional Optional Status (draft, sent, accepted, declined)
content string optional Optional Contract content
curl -X POST "https://yoursite.com/api/contracts" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "client_id": "...", "project_id": "...", "contract_date": "...", "valid_until": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Contract add success"},
  "id": 1
}

Delete a Contract

DELETE/api/contracts/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/contracts/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Contract delete success"}
}

Get Contract by ID

GET/api/contracts/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/contracts/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "title": "Contract A",
  "client_id": "2",
  "project_id": "1",
  "contract_date": "2024-01-15",
  "valid_until": "2024-12-31",
  "status": "sent"
}

Update a Contract

PUT/api/contracts/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Contract unique ID
title string optional Optional Title to update
status string optional Optional Status to update
note string optional Optional Note to update
content string optional Optional Content to update
curl -X PUT "https://yoursite.com/api/contracts/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Contract update success"}
}

Search Contracts

GET/api/contracts/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/contracts/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Contract A"
  }
]

Messages

List all Messages

GET/api/messages

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
from_user_id Number optional Optional filter by sender
to_user_id Number optional Optional filter by recipient
status String optional Optional filter by status (read, unread)
curl -X GET "https://yoursite.com/api/messages" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "subject": "Hello",
    "message": "Content",
    "from_user_id": "1",
    "to_user_id": "2",
    "status": "unread"
  }
]

Add New Message

POST/api/messages

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
subject string Mandatory Message subject
message string Mandatory Message content
from_user_id number Mandatory Sender user ID
to_user_id number Mandatory Recipient user ID
curl -X POST "https://yoursite.com/api/messages" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "subject": "...", "message": "...", "from_user_id": "...", "to_user_id": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Message add success"},
  "id": 1
}

Delete a Message

DELETE/api/messages/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/messages/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Message delete success"}
}

Get Message by ID

GET/api/messages/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/messages/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "subject": "Hello",
  "message": "Content",
  "from_user_id": "1",
  "to_user_id": "2",
  "status": "unread"
}

Update a Message

PUT/api/messages/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Message unique ID
subject string optional Optional Subject to update
message string optional Optional Message content to update
status string optional Optional Status (read, unread) to update
curl -X PUT "https://yoursite.com/api/messages/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Message update success"}
}

Search Messages

GET/api/messages/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/messages/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "subject": "Hello"
  }
]

Notes

List all Notes

GET/api/notes

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
project_id Number optional Optional filter by project ID
client_id Number optional Optional filter by client ID
is_public Number optional Optional filter by public/private (0 or 1)
curl -X GET "https://yoursite.com/api/notes" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Meeting notes",
    "description": "Summary",
    "project_id": "1",
    "client_id": "0",
    "is_public": "0"
  }
]

Add New Note

POST/api/notes

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title string Mandatory Note title
description string optional Optional Note description
project_id number optional Optional Project ID
client_id number optional Optional Client ID
is_public number optional Optional Public/Private (0 or 1) default: 0
created_by number optional Optional RISE user ID. Default: 1. Use for proper attribution.
curl -X POST "https://yoursite.com/api/notes" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Note add success"},
  "id": 1
}

Delete a Note

DELETE/api/notes/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/notes/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Note delete success"}
}

Get Note by ID

GET/api/notes/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/notes/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "title": "Meeting notes",
  "description": "Summary",
  "project_id": "1",
  "client_id": "0",
  "is_public": "0"
}

Update a Note

PUT/api/notes/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Note unique ID
title string optional Optional Title to update
description string optional Optional Description to update
is_public number optional Optional Public/Private to update
curl -X PUT "https://yoursite.com/api/notes/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Note update success"}
}

Search Notes

GET/api/notes/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/notes/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Meeting notes"
  }
]

Events

List all Events

GET/api/events

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
type String optional Optional filter by type (event, reminder)
project_id Number optional Optional filter by project ID
curl -X GET "https://yoursite.com/api/events" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Team meeting",
    "start_date": "2024-01-15",
    "end_date": null,
    "type": "event"
  }
]

Add New Event

POST/api/events

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title string Mandatory Event title
start_date string Mandatory Start date (Y-m-d)
end_date string optional Optional End date (Y-m-d)
description string optional Optional Event description
location string optional Optional Event location
created_by number optional Optional RISE user ID. Default: 1. Use for proper attribution.
curl -X POST "https://yoursite.com/api/events" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "start_date": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Event add success"},
  "id": 1
}

Delete an Event

DELETE/api/events/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/events/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Event delete success"}
}

Get Event by ID

GET/api/events/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/events/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "title": "Team meeting",
  "start_date": "2024-01-15",
  "end_date": null,
  "type": "event"
}

Update an Event

PUT/api/events/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Event unique ID
title string optional Optional Title to update
description string optional Optional Description to update
start_date string optional Optional Start date to update
end_date string optional Optional End date to update
location string optional Optional Location to update
curl -X PUT "https://yoursite.com/api/events/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Event update success"}
}

Search Events

GET/api/events/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/events/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Team meeting"
  }
]

Announcements

List all Announcements

GET/api/announcements

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/announcements" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Holiday notice",
    "description": "Office closed",
    "start_date": "2024-01-01",
    "end_date": "2024-01-02"
  }
]

Add New Announcement

POST/api/announcements

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title string Mandatory Announcement title
description string Mandatory Announcement description
start_date string Mandatory Start date (Y-m-d)
end_date string Mandatory End date (Y-m-d)
created_by number optional Optional RISE user ID. Default: 1. Use for proper attribution.
curl -X POST "https://yoursite.com/api/announcements" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "description": "...", "start_date": "...", "end_date": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Announcement add success"},
  "id": 1
}

Delete an Announcement

DELETE/api/announcements/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/announcements/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Announcement delete success"}
}

Get Announcement by ID

GET/api/announcements/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/announcements/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "title": "Holiday notice",
  "description": "Office closed",
  "start_date": "2024-01-01",
  "end_date": "2024-01-02"
}

Update an Announcement

PUT/api/announcements/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Announcement unique ID
title string optional Optional Title to update
description string optional Optional Description to update
start_date string optional Optional Start date to update
end_date string optional Optional End date to update
curl -X PUT "https://yoursite.com/api/announcements/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Announcement update success"}
}

Search Announcements

GET/api/announcements/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/announcements/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Holiday notice"
  }
]

Leave Applications

List all Leave Applications

GET/api/leave-applications

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
applicant_id Number optional Optional filter by applicant user ID
status String optional Optional filter by status (pending, approved, rejected, canceled)
curl -X GET "https://yoursite.com/api/leave-applications" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "leave_type_id": "1",
    "applicant_id": "1",
    "start_date": "2024-01-15",
    "end_date": "2024-01-17",
    "reason": "Personal",
    "status": "pending"
  }
]

Add Leave Application

POST/api/leave-applications

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
leave_type_id number Mandatory Leave type ID
applicant_id number Mandatory Applicant user ID
start_date string Mandatory Start date (Y-m-d)
end_date string Mandatory End date (Y-m-d)
reason string Mandatory Leave reason
total_days number optional Optional Total days (auto-calculated if not provided)
curl -X POST "https://yoursite.com/api/leave-applications" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "leave_type_id": "...", "applicant_id": "...", "start_date": "...", "end_date": "...", "reason": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Leave application add success"},
  "id": 1
}

Delete Leave Application

DELETE/api/leave-applications/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/leave-applications/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Leave application delete success"}
}

Get Leave Application by ID

GET/api/leave-applications/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/leave-applications/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "leave_type_id": "1",
  "applicant_id": "1",
  "start_date": "2024-01-15",
  "end_date": "2024-01-17",
  "reason": "Personal",
  "status": "pending"
}

Update Leave Application

PUT/api/leave-applications/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Leave application unique ID
status string optional Optional Status (pending, approved, rejected, canceled) to update
reason string optional Optional Reason to update
curl -X PUT "https://yoursite.com/api/leave-applications/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Leave application update success"}
}

Search Leave Applications

GET/api/leave-applications/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/leave-applications/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "reason": "Personal leave"
  }
]

To Do

List all ToDo Items

GET/api/todos

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
status String optional Optional filter by status (to_do, done)
created_by Number optional Optional filter by creator user ID
curl -X GET "https://yoursite.com/api/todos" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Task",
    "description": "",
    "status": "to_do",
    "created_by": "1"
  }
]

Add New ToDo Item

POST/api/todos

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title string Mandatory ToDo title
description string optional Optional ToDo description
status string optional Optional Status (to_do, done) default: to_do
start_date string optional Optional Start date (Y-m-d)
created_by number optional Optional RISE user ID. Default: 1. Use for proper attribution.
curl -X POST "https://yoursite.com/api/todos" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "ToDo add success"},
  "id": 1
}

Delete a ToDo Item

DELETE/api/todos/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/todos/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "ToDo delete success"}
}

Get ToDo by ID

GET/api/todos/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/todos/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "title": "Task",
  "description": "",
  "status": "to_do"
}

Update a ToDo Item

PUT/api/todos/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number ToDo unique ID
title string optional Optional Title to update
description string optional Optional Description to update
status string optional Optional Status (to_do, done) to update
curl -X PUT "https://yoursite.com/api/todos/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "ToDo update success"}
}

Search ToDo Items

GET/api/todos/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/todos/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Task"
  }
]

Attendance

List all Attendance Records

GET/api/attendance

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
user_id Number optional Optional filter by user ID
status String optional Optional filter by status (pending, approved, rejected)
curl -X GET "https://yoursite.com/api/attendance" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "user_id": "1",
    "in_time": "2024-01-15 09:00:00",
    "out_time": null,
    "status": "pending"
  }
]

Add Attendance Record

POST/api/attendance

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
user_id number Mandatory User ID
in_time string Mandatory Clock-in time (Y-m-d H:i:s)
out_time string optional Optional Clock-out time (Y-m-d H:i:s)
note string optional Optional Note
curl -X POST "https://yoursite.com/api/attendance" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "user_id": "...", "in_time": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Attendance add success"},
  "id": 1
}

Delete Attendance

DELETE/api/attendance/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/attendance/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Attendance delete success"}
}

Get Attendance by ID

GET/api/attendance/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/attendance/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "user_id": "1",
  "in_time": "2024-01-15 09:00:00",
  "out_time": null,
  "status": "pending"
}

Update Attendance

PUT/api/attendance/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Attendance record unique ID
out_time string optional Optional Clock-out time
status string optional Optional Status (pending, approved, rejected)
note string optional Optional Note
curl -X PUT "https://yoursite.com/api/attendance/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Attendance update success"}
}

Search Attendance

GET/api/attendance/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/attendance/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "user_id": "1"
  }
]

Payment Methods

List all Payment Methods

GET/api/payment-methods

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/payment-methods" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Bank Transfer",
    "description": "",
    "type": "custom"
  }
]

Add Payment Method

POST/api/payment-methods

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title string Mandatory Payment method title
description string optional Optional Payment method description
curl -X POST "https://yoursite.com/api/payment-methods" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Payment method add success"},
  "id": 1
}

Delete Payment Method

DELETE/api/payment-methods/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/payment-methods/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Payment method delete success"}
}

Get Payment Method by ID

GET/api/payment-methods/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/payment-methods/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "title": "Bank Transfer",
  "description": "",
  "type": "custom"
}

Update Payment Method

PUT/api/payment-methods/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Payment method unique ID
title string optional Optional Title to update
description string optional Optional Description to update
curl -X PUT "https://yoursite.com/api/payment-methods/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Payment method update success"}
}

Search Payment Methods

GET/api/payment-methods/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/payment-methods/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "Bank Transfer"
  }
]

Notifications

List all Notifications

GET/api/notifications

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
user_id Number optional Optional filter by user ID
status String optional Optional filter by status (read, unread)
curl -X GET "https://yoursite.com/api/notifications" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "user_id": "1",
    "event": "task_assigned",
    "title": "New task",
    "is_read": "0"
  }
]

Add Notification

POST/api/notifications

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
user_id number Mandatory User ID
event string Mandatory Event name
title string optional Optional Notification title
curl -X POST "https://yoursite.com/api/notifications" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "user_id": "...", "event": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Notification add success"},
  "id": 1
}

Delete Notification

DELETE/api/notifications/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X DELETE "https://yoursite.com/api/notifications/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Notification delete success"}
}

Get Notification by ID

GET/api/notifications/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/notifications/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "user_id": "1",
  "event": "task_assigned",
  "title": "New task",
  "is_read": "0"
}

Update Notification (Mark as Read)

PUT/api/notifications/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Notification unique ID
curl -X PUT "https://yoursite.com/api/notifications/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Notification update success"}
}

Search Notifications

GET/api/notifications/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/notifications/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "title": "New task"
  }
]

Activity Logs

List all Activity Logs (Read-Only)

GET/api/activity-logs

Read-only endpoint for audit trail viewing

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
log_type String optional Optional filter by log type
action String optional Optional filter by action (created, updated, deleted)
created_by Number optional Optional filter by user ID
curl -X GET "https://yoursite.com/api/activity-logs" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "log_type": "project",
    "action": "created",
    "created_by": "1",
    "created_at": "2024-01-15 10:00:00"
  }
]

Get Activity Log by ID (Read-Only)

GET/api/activity-logs/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/activity-logs/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "log_type": "project",
  "action": "created",
  "created_by": "1",
  "created_at": "2024-01-15 10:00:00"
}

Search Activity Logs

GET/api/activity-logs/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/activity-logs/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "log_type": "project",
    "action": "created"
  }
]

Line Items

List the lines of a document

GET/api/{parent}/{id}/items

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
parent String Document type owning the lines
id Number Parent document unique ID
curl -X GET "https://yoursite.com/api/1/123/items" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": 12,
    "title": "Design work",
    "description": "Landing page",
    "quantity": 2,
    "unit_type": "hours",
    "rate": 100,
    "total": 200,
    "sort": 0,
    "item_id": 0,
    "taxable": 1
  }
]

Append a line to a document

POST/api/{parent}/{id}/items

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
parent String Document type owning the lines
id Number Parent document unique ID
title String Mandatory line title. A description is accepted instead.
description String optional Optional line description
quantity Number Mandatory quantity, numeric
rate Number Mandatory unit rate, numeric
unit_type String optional Optional unit type, maximum 20 characters
sort Number optional Optional display order. Defaults to the end of the list.
item_id Number optional Optional items library ID
taxable Number optional Invoices only. 1 (default) or 0.
curl -X POST "https://yoursite.com/api/1/123/items" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "quantity": "...", "rate": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "The record has been saved."},
  "id": 12
}

Replace all the lines of a document

PUT/api/{parent}/{id}/items

Idempotent bulk set. Every existing line of the document is removed and the supplied set is written in its place, then the document totals are recalculated. The whole payload is validated before anything is written and the write runs in a transaction, so a single bad line leaves the document untouched. An empty array is rejected with a 400 rather than clearing the document; remove lines one by one with the DELETE endpoint.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
parent String Document type owning the lines
id Number Parent document unique ID
items Object[] Mandatory non empty list of lines, in the same shape the GET returns
items.title String Mandatory line title. A description is accepted instead.
items.description String optional Optional line description
items.quantity Number Mandatory quantity, numeric
items.rate Number Mandatory unit rate, numeric
items.unit_type String optional Optional unit type, maximum 20 characters
items.sort Number optional Optional display order. Defaults to the array position.
items.item_id Number optional Optional items library ID
items.taxable Number optional Invoices only. 1 (default) or 0.
curl -X PUT "https://yoursite.com/api/1/123/items" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "items": "...", "items.title": "...", "items.quantity": "...", "items.rate": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "The record has been saved."},
  "saved": 2,
  "items": [
    {"id": 12, "title": "Design work", "description": "", "quantity": 2, "unit_type": "hours", "rate": 100, "total": 200, "sort": 0, "item_id": 0, "taxable": 1}
  ]
}

Delete one line of a document

DELETE/api/{parent}/{id}/items/{itemId}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
parent String Document type owning the lines
id Number Parent document unique ID
itemId Number Line unique ID. It must belong to that document.
curl -X DELETE "https://yoursite.com/api/1/123/items/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "The record has been deleted."}
}

Knowledge Base

List Knowledge Base Articles

GET/api/knowledge-base/articles

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
type String optional Optional area filter, knowledge_base or help. Defaults to knowledge_base
include_internal Boolean optional Optional, set to 1 to include the internal help area. Defaults to 0
status String optional Optional article status, active or inactive. Only honoured when include_internal is 1
category_id Number optional Optional filter by help category ID
label_id Number optional Optional filter by label ID
curl -X GET "https://yoursite.com/api/knowledge-base/articles" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": "12",
    "title": "How to reset a password",
    "category_id": "3",
    "category_title": "Getting started",
    "type": "knowledge_base",
    "status": "active",
    "total_views": "41",
    "sort": "0"
  }
]

Add New Article

POST/api/knowledge-base/articles

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title String Mandatory Article title
category_id Number Mandatory Help category ID, must exist
description String optional Optional Article body
status String optional Optional active or inactive, defaults to active
sort Number optional Optional sort order, defaults to 0
labels String optional Optional comma separated label IDs
related_article_ids String optional Optional comma separated article IDs
created_by Number optional Optional user ID to attribute the record to
curl -X POST "https://yoursite.com/api/knowledge-base/articles" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "category_id": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "The record has been saved."}, "id": 12 }

Delete an Article

DELETE/api/knowledge-base/articles/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Article unique ID
curl -X DELETE "https://yoursite.com/api/knowledge-base/articles/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": {"success": "The record has been deleted."} }

Get Article by ID

GET/api/knowledge-base/articles/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Article unique ID
include_internal Boolean optional Optional, set to 1 to allow reading an internal help article
curl -X GET "https://yoursite.com/api/knowledge-base/articles/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update an Article

PUT/api/knowledge-base/articles/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Article unique ID
title String optional Optional Article title
description String optional Optional Article body
category_id Number optional Optional Help category ID, must exist
status String optional Optional active or inactive
sort Number optional Optional sort order
labels String optional Optional comma separated label IDs
related_article_ids String optional Optional comma separated article IDs
curl -X PUT "https://yoursite.com/api/knowledge-base/articles/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": {"success": "The record has been saved."} }

Get Article Feedback Counters

GET/api/knowledge-base/articles/{id}/helpful

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Article unique ID
include_internal Boolean optional Optional, set to 1 to allow an internal help article
curl -X GET "https://yoursite.com/api/knowledge-base/articles/123/helpful" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{ "article_id": 12, "total_feedback": "9", "helpful_status_yes": "7", "helpful_status_no": "2" }

Record Article Feedback

POST/api/knowledge-base/articles/{id}/helpful

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Article unique ID
status String Mandatory yes or no
created_by Number optional Optional user ID to attribute the vote to
curl -X POST "https://yoursite.com/api/knowledge-base/articles/123/helpful" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "status": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "The record has been saved."}, "id": 5 }

Search Articles

GET/api/knowledge-base/articles/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords, matched against title and body
type String optional Optional area filter, knowledge_base or help
include_internal Boolean optional Optional, set to 1 to search the internal help area too
category_id Number optional Optional filter by help category ID
curl -X GET "https://yoursite.com/api/knowledge-base/articles/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

List Knowledge Base Categories

GET/api/knowledge-base/categories

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
type String optional Optional area filter, knowledge_base or help. Defaults to knowledge_base
include_internal Boolean optional Optional, set to 1 to include the internal help area. Defaults to 0
curl -X GET "https://yoursite.com/api/knowledge-base/categories" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": "3",
    "title": "Getting started",
    "type": "knowledge_base",
    "status": "active",
    "sort": "1",
    "articles_order": "A-Z",
    "total_articles": "8"
  }
]

Add New Category

POST/api/knowledge-base/categories

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title String Mandatory Category title
type String Mandatory knowledge_base or help
description String optional Optional Category description
status String optional Optional active or inactive, defaults to active
sort Number optional Optional sort order, defaults to 0
articles_order String optional Optional A-Z or Z-A
banner_url String optional Optional banner link
related_articles String optional Optional comma separated label IDs used to build the related list
curl -X POST "https://yoursite.com/api/knowledge-base/categories" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "type": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "The record has been saved."}, "id": 3 }

Delete a Category

DELETE/api/knowledge-base/categories/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Category unique ID
curl -X DELETE "https://yoursite.com/api/knowledge-base/categories/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": {"success": "The record has been deleted."} }

Get Category by ID

GET/api/knowledge-base/categories/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Category unique ID
include_internal Boolean optional Optional, set to 1 to allow reading an internal help category
curl -X GET "https://yoursite.com/api/knowledge-base/categories/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update a Category

PUT/api/knowledge-base/categories/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Category unique ID
title String optional Optional Category title
description String optional Optional Category description
type String optional Optional knowledge_base or help
status String optional Optional active or inactive
sort Number optional Optional sort order
articles_order String optional Optional A-Z or Z-A
banner_url String optional Optional banner link
related_articles String optional Optional comma separated label IDs
curl -X PUT "https://yoursite.com/api/knowledge-base/categories/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": {"success": "The record has been saved."} }

Search Categories

GET/api/knowledge-base/categories/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords, matched against title and description
type String optional Optional area filter, knowledge_base or help
include_internal Boolean optional Optional, set to 1 to search the internal help area too
curl -X GET "https://yoursite.com/api/knowledge-base/categories/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Checklists

List Checklist Groups

GET/api/checklists/groups

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/checklists/groups" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[ { "id": "2", "title": "Project kickoff", "checklists": "4,5,6", "deleted": "0" } ]

Add Checklist Group

POST/api/checklists/groups

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title String Mandatory Group title
checklists String Mandatory comma separated checklist template IDs
curl -X POST "https://yoursite.com/api/checklists/groups" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "checklists": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "The record has been saved."}, "id": 2 }

Delete a Checklist Group

DELETE/api/checklists/groups/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Checklist group unique ID
curl -X DELETE "https://yoursite.com/api/checklists/groups/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": {"success": "The record has been deleted."} }

Get Checklist Group by ID

GET/api/checklists/groups/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Checklist group unique ID
curl -X GET "https://yoursite.com/api/checklists/groups/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update a Checklist Group

PUT/api/checklists/groups/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Checklist group unique ID
title String optional Optional Group title
checklists String optional Optional comma separated checklist template IDs
curl -X PUT "https://yoursite.com/api/checklists/groups/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": {"success": "The record has been saved."} }

List Templates of a Checklist Group

GET/api/checklists/groups/{id}/templates

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Checklist group unique ID
curl -X GET "https://yoursite.com/api/checklists/groups/123/templates" \
  -H "authtoken: YOUR_API_TOKEN"

Search Checklist Groups

GET/api/checklists/groups/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords, matched against the group title
curl -X GET "https://yoursite.com/api/checklists/groups/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

List Checklist Items of a Task

GET/api/checklists/items

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
task_id Number Mandatory Task ID the checklist belongs to, must be 1 or more
limit Number optional Optional page size, 1 to 200

default: 50

offset Number optional Optional number of rows to skip

default: 0

curl -X GET "https://yoursite.com/api/checklists/items" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": "7",
    "title": "Attach the signed SOW",
    "is_checked": "0",
    "task_id": "42",
    "sort": "1000",
    "new_sort": "1000",
    "client_id": "5"
  }
]

Add Checklist Item to a Task

POST/api/checklists/items

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
task_id Number Mandatory Task ID, must exist
title String Mandatory Checklist item title
is_checked Number optional Optional 0 or 1, defaults to 0
sort Number optional Optional sort value, defaults to the next free slot on the task
curl -X POST "https://yoursite.com/api/checklists/items" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "task_id": "...", "title": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "The record has been saved."}, "id": 7 }

Delete a Checklist Item

DELETE/api/checklists/items/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Checklist item unique ID
curl -X DELETE "https://yoursite.com/api/checklists/items/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": {"success": "The record has been deleted."} }

Get Checklist Item by ID

GET/api/checklists/items/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Checklist item unique ID
curl -X GET "https://yoursite.com/api/checklists/items/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update a Checklist Item

PUT/api/checklists/items/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Checklist item unique ID
title String optional Optional Checklist item title
is_checked Number optional Optional 0 or 1
sort Number optional Optional sort value
curl -X PUT "https://yoursite.com/api/checklists/items/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": {"success": "The record has been saved."} }

Apply a Checklist Group to a Task

POST/api/checklists/items/apply-group

Copies every template of the group onto the task as new checklist items, the same way the task detail screen does it.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
task_id Number Mandatory Task ID, must exist
group_id Number Mandatory Checklist group ID, must exist
curl -X POST "https://yoursite.com/api/checklists/items/apply-group" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "task_id": "...", "group_id": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "The record has been saved."}, "ids": [7, 8, 9] }

Search Checklist Items

GET/api/checklists/items/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords, matched against the item title
task_id Number optional Optional filter by task ID
curl -X GET "https://yoursite.com/api/checklists/items/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Get Checklist Progress of a Task

GET/api/checklists/tasks/{task_id}/summary

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
task_id Number Task unique ID
curl -X GET "https://yoursite.com/api/checklists/tasks/123/summary" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{ "task_id": 42, "total_items": "6", "checked_items": "4" }

List Checklist Templates

GET/api/checklists/templates

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
group_id Number optional Optional filter by checklist group ID
curl -X GET "https://yoursite.com/api/checklists/templates" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[ { "id": "4", "title": "Collect the kickoff notes", "deleted": "0" } ]

Add Checklist Template

POST/api/checklists/templates

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title String Mandatory Template title
curl -X POST "https://yoursite.com/api/checklists/templates" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": {"success": "The record has been saved."}, "id": 4 }

Delete a Checklist Template

DELETE/api/checklists/templates/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Checklist template unique ID
curl -X DELETE "https://yoursite.com/api/checklists/templates/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": {"success": "The record has been deleted."} }

Get Checklist Template by ID

GET/api/checklists/templates/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Checklist template unique ID
curl -X GET "https://yoursite.com/api/checklists/templates/123" \
  -H "authtoken: YOUR_API_TOKEN"

Update a Checklist Template

PUT/api/checklists/templates/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Checklist template unique ID
title String optional Optional Template title
curl -X PUT "https://yoursite.com/api/checklists/templates/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": {"success": "The record has been saved."} }

Search Checklist Templates

GET/api/checklists/templates/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords, matched against the template title
curl -X GET "https://yoursite.com/api/checklists/templates/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Files

List Files of a context

GET/api/files

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
context String Mandatory context. One of: project, client, global, user. RISE has no task file table, so tasks cannot be listed.
context_id Number optional Mandatory for project (project ID), client (client ID) and user (RISE user ID). Ignored for global.
folder_id Number optional Optional folder filter. Send 0 for the root of the context.
category_id Number optional Optional file category filter. Project context only.
limit Number optional Optional page size, 1 to 200.

default: 50

offset Number optional Optional number of rows to skip.

default: 0

curl -X GET "https://yoursite.com/api/files" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": "12",
    "file_name": "file64b1c2-quote.pdf",
    "file_id": null,
    "service_type": null,
    "description": "Signed quote",
    "file_size": "20480",
    "created_at": "2026-07-23 09:15:00",
    "project_id": "4",
    "uploaded_by": "1",
    "category_id": "0",
    "folder_id": "0",
    "uploaded_by_user_name": "Jane Doe",
    "category_name": null,
    "source": "project"
  }
]

Error-Response:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "Unknown context. Use one of: project, client, global, user." } }

Upload a File

POST/api/files

The filename sent by the client is never used as given: it is reduced to its basename, rewritten to a strict character whitelist, length capped, then validated against the RISE core extension allowlist before the core move_temp_file() gives it a unique prefix.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
Content-Type String multipart/form-data

Parameters

FieldTypeDescription
file File Mandatory file part. The extension must be listed in the RISE "accepted file formats" setting; PHP extensions are always refused. Maximum 25 MB.
context String Mandatory context. One of: project, client, global, user.
context_id Number optional Mandatory for project (project ID), client (client ID) and user (RISE user ID). Ignored for global.
folder_id Number optional Optional destination folder ID. Default 0, meaning the root of the context.
category_id Number optional Optional file category ID. Project context only.
description String optional Optional description stored with the file.
created_by Number optional Optional RISE user ID recorded as the uploader. Default: 1.
curl -X POST "https://yoursite.com/api/files" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "file": "...", "context": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "The record has been saved."},
  "id": 12,
  "source": "project"
}

Error-Response:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "File type is not allowed." } }

Delete a File

DELETE/api/files/{source}/{id}

Soft-deletes the metadata row through the core model, so the RISE activity log still fires, and then removes the stored bytes exactly as the RISE interface does. The location is rebuilt from the stored row, resolved with realpath() and skipped unless it is inside the configured files directory. That check runs for every row, including rows held by an external storage service, because the core file deletion falls back to a local unlink whenever the plugin behind a service_type is not installed.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
source String Which file table the id belongs to: project or general
id Number File unique ID inside that table
curl -X DELETE "https://yoursite.com/api/files/source/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "The record has been deleted."}
}

Error-Response:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "The record is in use, you can't delete the record!" } }

Get File metadata by source and ID

GET/api/files/{source}/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
source String Which file table the id belongs to: project or general
id Number File unique ID inside that table
curl -X GET "https://yoursite.com/api/files/source/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "id": "12",
  "file_name": "file64b1c2-quote.pdf",
  "service_type": null,
  "description": "Signed quote",
  "file_size": "20480",
  "created_at": "2026-07-23 09:15:00",
  "project_id": "4",
  "uploaded_by": "1",
  "uploaded_by_user_name": "Jane Doe",
  "source": "project"
}

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Download a File

GET/api/files/{source}/{id}/download

Streams the stored bytes as an attachment. The path is rebuilt from the stored row and the RISE file path settings - never from anything the caller sends - resolved with realpath() and refused unless it sits inside the configured files directory. Files held by Google Drive or a custom storage plugin have no local bytes and answer 409.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
source String Which file table the id belongs to: project or general
id Number File unique ID inside that table
curl -X GET "https://yoursite.com/api/files/source/123/download" \
  -H "authtoken: YOUR_API_TOKEN"

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

List File Categories

GET/api/files/categories

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
type String optional Optional category type filter. The shipped schema only defines "project".
limit Number optional Optional page size, 1 to 200.

default: 50

offset Number optional Optional number of rows to skip.

default: 0

curl -X GET "https://yoursite.com/api/files/categories" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  { "id": "2", "name": "Contracts", "type": "project" }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

List Folders

GET/api/files/folders

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
context String optional Optional folder context. One of: project, client, file_manager.
context_id Number optional Optional owning record ID (project ID for project, client ID for client).
parent_id Number optional Optional parent folder ID. Send 0 for root folders.
limit Number optional Optional page size, 1 to 200.

default: 50

offset Number optional Optional number of rows to skip.

default: 0

curl -X GET "https://yoursite.com/api/files/folders" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": "7",
    "title": "Contracts",
    "folder_id": "a1b2c3d-4e5f6-7g8h-9i0j1-kLmNoPqRsTu",
    "parent_id": "0",
    "level": "",
    "created_by": "1",
    "created_at": "2026-07-23 09:15:00",
    "permissions": "9-all_team_members,",
    "context": "project",
    "context_id": "4",
    "created_by_user_name": "Jane Doe"
  }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Search Files

GET/api/files/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords, matched as a substring of the file name or the description
curl -X GET "https://yoursite.com/api/files/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  { "id": "12", "file_name": "file64b1c2-quote.pdf", "source": "project" },
  { "id": "3", "file_name": "file71ff90-contract.pdf", "source": "general" }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Estimate Comments

List all Estimate Comments

GET/api/estimate-comments

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
estimate_id Number optional Optional filter by estimate ID
curl -X GET "https://yoursite.com/api/estimate-comments" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "estimate_id": "1",
    "description": "Comment text",
    "created_by": "1",
    "created_at": "2026-07-23 09:15:00"
  }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Add Estimate Comment

POST/api/estimate-comments

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
estimate_id number Mandatory Estimate ID
description string Mandatory Comment content
created_by number optional Optional RISE user ID (commenter). Default: 1. Use for proper attribution.
curl -X POST "https://yoursite.com/api/estimate-comments" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "estimate_id": "...", "description": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Comment added successfully."},
  "id": 1
}

Error-Response:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "Failed to add comment." } }

Delete Estimate Comment

DELETE/api/estimate-comments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Estimate comment unique ID
curl -X DELETE "https://yoursite.com/api/estimate-comments/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Comment deleted successfully."}
}

Error-Response:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "Failed to delete comment." } }

Get Estimate Comment by ID

GET/api/estimate-comments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Estimate comment unique ID
curl -X GET "https://yoursite.com/api/estimate-comments/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "estimate_id": "1",
  "description": "Comment text"
}

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "Invalid comment ID." } }

Update Estimate Comment

PUT/api/estimate-comments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Estimate comment unique ID
description string optional Optional Comment content to update
curl -X PUT "https://yoursite.com/api/estimate-comments/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Comment updated successfully."}
}

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "Invalid comment ID." } }

Search Estimate Comments

GET/api/estimate-comments/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords, matched against the comment text
curl -X GET "https://yoursite.com/api/estimate-comments/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "description": "Comment text"
  }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Proposal Comments

List all Proposal Comments

GET/api/proposal-comments

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
proposal_id Number optional Optional filter by proposal ID
curl -X GET "https://yoursite.com/api/proposal-comments" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "proposal_id": "1",
    "description": "Comment text",
    "created_by": "1",
    "created_at": "2026-07-23 09:15:00"
  }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Add Proposal Comment

POST/api/proposal-comments

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
proposal_id number Mandatory Proposal ID
description string Mandatory Comment content
created_by number optional Optional RISE user ID (commenter). Default: 1. Use for proper attribution.
curl -X POST "https://yoursite.com/api/proposal-comments" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "proposal_id": "...", "description": "..." }'

Success-Response:

HTTP/1.1 201 Created
{
  "status": 200,
  "messages": {"success": "Comment added successfully."},
  "id": 1
}

Error-Response:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "Failed to add comment." } }

Delete Proposal Comment

DELETE/api/proposal-comments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Proposal comment unique ID
curl -X DELETE "https://yoursite.com/api/proposal-comments/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Comment deleted successfully."}
}

Error-Response:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "Failed to delete comment." } }

Get Proposal Comment by ID

GET/api/proposal-comments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Proposal comment unique ID
curl -X GET "https://yoursite.com/api/proposal-comments/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "proposal_id": "1",
  "description": "Comment text"
}

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "Invalid comment ID." } }

Update Proposal Comment

PUT/api/proposal-comments/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Proposal comment unique ID
description string optional Optional Comment content to update
curl -X PUT "https://yoursite.com/api/proposal-comments/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": {"success": "Comment updated successfully."}
}

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "Invalid comment ID." } }

Search Proposal Comments

GET/api/proposal-comments/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords, matched against the comment text
curl -X GET "https://yoursite.com/api/proposal-comments/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
  {
    "id": "1",
    "description": "Comment text"
  }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Team

List all Teams

GET/api/teams

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/teams" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  { "id": "1", "title": "Design", "members": "3,7,12", "deleted": "0" }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Add New Team

POST/api/teams

Every member id is validated against the users table before the team is stored: an id which is unknown, deleted or not a staff user is rejected and nothing is written.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
title String Mandatory Team title
members String|Number[] Mandatory Staff user ids, as an array or a comma separated list
curl -X POST "https://yoursite.com/api/teams" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "...", "members": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": { "success": "The record has been saved." }, "id": 1 }

Invalid-Member:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "members": "Unknown or non staff user id: 99." } }

Delete a Team

DELETE/api/teams/{id}

Soft delete. The team leaves every listing but stays in the database and can be restored by an administrator. The staff users themselves are not touched.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Team unique ID
curl -X DELETE "https://yoursite.com/api/teams/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": { "success": "The record has been deleted." } }

Error-Response:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "This record can't be deleted" } }

Get Team by ID

GET/api/teams/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Team unique ID
curl -X GET "https://yoursite.com/api/teams/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{ "id": "1", "title": "Design", "members": "3,7,12", "deleted": "0" }

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Update a Team

PUT/api/teams/{id}

Only the fields present in the request change. Sending members replaces the whole member list, it does not append to it. Leaving members out keeps the current list untouched, while sending it as an empty array or an empty string empties the team - that is the only way to remove the last member.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Team unique ID
title String optional Optional Team title
members String|Number[] optional Optional Staff user ids, as an array or a comma separated list. Replaces the whole list. An empty array or empty string is rejected with a 400 - RISE requires every team to keep at least one member, so delete the team instead of emptying it.
curl -X PUT "https://yoursite.com/api/teams/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "field": "value" }'

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": { "success": "The record has been saved." } }

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

List the Members of a Team

GET/api/teams/{id}/members

Resolves the comma separated members column of the team into the matching staff users. Salary, date of hire and every other team_member_job_info column are never part of the response, and neither are password, ssn or dob.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Team unique ID
curl -X GET "https://yoursite.com/api/teams/123/members" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": "3",
    "first_name": "Fname",
    "last_name": "Lname",
    "email": "member@example.com",
    "phone": "1234567890",
    "job_title": "Designer",
    "user_type": "staff",
    "status": "active",
    "image": null,
    "gender": "female",
    "created_at": "2026-01-15 10:00:00",
    "last_online": "2026-07-23 09:15:00"
  }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Search Teams

GET/api/teams/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords, matched against the team title
curl -X GET "https://yoursite.com/api/teams/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  { "id": "1", "title": "Design", "members": "3,7,12" }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Roles

List all Roles (Read-Only)

GET/api/roles

Roles are exposed read-only. A role holds the permission map of every staff member assigned to it, so granting or editing one through the API would be a privilege escalation path; create and edit roles in the RISE admin area instead. The serialised permissions column is omitted from this listing.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/roles" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  { "id": "1", "title": "Project manager", "deleted": "0" },
  { "id": "2", "title": "Support agent", "deleted": "0" }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Get Role by ID (Read-Only)

GET/api/roles/{id}

Read-only, like every roles endpoint. The response also reports how many active staff users are assigned to the role, which is what an integration needs before anybody edits it in the admin area. The serialised permissions column is only included when include_permissions is set.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Role unique ID
include_permissions String optional Send 1, true, yes or on to include the serialised permissions column
curl -X GET "https://yoursite.com/api/roles/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{ "id": "1", "title": "Project manager", "deleted": "0", "assigned_users": 4 }

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Search Roles (Read-Only)

GET/api/roles/search/{keyword}

Turns a role name into a role id. Search results never carry the permissions column.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords, matched against the role title
curl -X GET "https://yoursite.com/api/roles/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  { "id": "1", "title": "Project manager" }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Project Members

List Project Members

GET/api/project-members

Without a filter this returns the memberships of every project, capped at 500 rows. Pass project_id to list the members of one project.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
project_id Number optional Optional filter by project ID
user_id Number optional Optional filter by user ID
is_leader Number optional Optional filter by the leader flag, 0 or 1
curl -X GET "https://yoursite.com/api/project-members" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": "6",
    "user_id": "3",
    "project_id": "1",
    "is_leader": "1",
    "member_name": "Fname Lname",
    "member_image": null,
    "member_email": "member@example.com",
    "job_title": "Designer",
    "user_type": "staff",
    "member_status": "active",
    "project_title": "Website redesign",
    "client_id": "5"
  }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Add a Member to a Project

POST/api/project-members

The project and the user must both exist. Staff users can join any project; a client contact can only join a project of their own client, which is the rule the RISE project screen applies. Adding somebody who was removed earlier restores their original membership row, so the id stays the same and no duplicate is created.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
project_id Number Mandatory Project ID
user_id Number Mandatory User ID of the member
is_leader Number optional Optional 0 or 1, defaults to 0
curl -X POST "https://yoursite.com/api/project-members" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "project_id": "...", "user_id": "..." }'

Success-Response:

HTTP/1.1 201 Created
{ "status": 200, "messages": { "success": "The record has been saved." }, "id": 6 }

Already-A-Member:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "user_id": "This user is already a member of the project." } }

Not-Allowed:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "user_id": "A client contact can only be added to a project of their own client." } }

Remove a Member from a Project

DELETE/api/project-members/{id}

Soft delete of the membership only. The user account and the project are not touched, and adding the same user back later restores this very row.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Membership unique ID, not the user ID
curl -X DELETE "https://yoursite.com/api/project-members/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": { "success": "The record has been deleted." } }

Error-Response:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "This record can't be deleted" } }

Get Project Member by ID

GET/api/project-members/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Membership unique ID, not the user ID
curl -X GET "https://yoursite.com/api/project-members/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "id": "6",
  "user_id": "3",
  "project_id": "1",
  "is_leader": "1",
  "member_name": "Fname Lname",
  "member_email": "member@example.com",
  "job_title": "Designer",
  "user_type": "staff",
  "project_title": "Website redesign"
}

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Update a Project Membership

PUT/api/project-members/{id}

Only the leader flag can change. Moving a membership to another project or another user is not offered on purpose - that is a different access decision, so remove the membership and add the new one instead. A project_id or user_id sent in the body is ignored.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Membership unique ID
is_leader Number Mandatory 0 or 1
curl -X PUT "https://yoursite.com/api/project-members/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "is_leader": "..." }'

Success-Response:

HTTP/1.1 200 OK
{ "status": 200, "messages": { "success": "The record has been saved." } }

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Search Project Members

GET/api/project-members/search/{keyword}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
keyword String Search keywords, matched against the member name, the member email and the project title
project_id Number optional Optional filter by project ID
curl -X GET "https://yoursite.com/api/project-members/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": "6",
    "user_id": "3",
    "project_id": "1",
    "is_leader": "1",
    "member_name": "Fname Lname",
    "member_email": "member@example.com",
    "job_title": "Designer",
    "user_type": "staff",
    "project_title": "Website redesign"
  }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Templates

List the available Template types

GET/api/templates

Discovery endpoint: the template types this API understands and how many templates of each type exist. Every other templates endpoint takes one of these type values.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/templates" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  { "type": "email", "label": "email template", "total": 47, "path": "/api/templates/email" },
  { "type": "ticket", "label": "ticket template", "total": 3, "path": "/api/templates/ticket" },
  { "type": "contract", "label": "contract template", "total": 2, "path": "/api/templates/contract" },
  { "type": "proposal", "label": "proposal template", "total": 2, "path": "/api/templates/proposal" }
]

List Templates of a type (Read-Only)

GET/api/templates/{type}

Returns the identifying columns of every template of the type, capped at 500 rows. The template body is left out here because it is a whole HTML document; read one template by id to get it. Templates are read-only through this API - see the resource description.

Passing search lowers the default page size to 20 rows. That default is only a default: send limit to ask for more, up to the 500 row ceiling. Every listing reports the cap it applied in the X-Result-Limit response header, the ceiling in X-Result-Max-Limit, and whether the cap is what ended the list in X-Result-Truncated, so a truncated page is never mistaken for the whole set.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
type String Template type
search String optional Optional keyword, matched against the template name or title
limit Number optional Optional page size, 1 to 500. Defaults to 500, or to 20 when search is used
template_type String optional Optional filter, email templates only
language String optional Optional language filter, email templates only
ticket_type_id Number optional Optional filter by ticket type, ticket templates only
curl -X GET "https://yoursite.com/api/templates/lead" \
  -H "authtoken: YOUR_API_TOKEN"

Email-Response:

HTTP/1.1 200 OK
[
  {
    "id": "1",
    "template_name": "login_info",
    "email_subject": "Login details",
    "template_type": "default",
    "language": ""
  }
]

Contract-Response:

HTTP/1.1 200 OK
[
  { "id": "1", "title": "Template 3.7" }
]

Invalid-Type:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "type": "Invalid template type. Allowed values: email, ticket, contract, proposal" } }

No-Data:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Get one Template with its body (Read-Only)

GET/api/templates/{type}/{id}

The full template, body included. Which columns come back depends on the type: an email template carries email_subject, default_message, custom_message, template_type and language, a ticket template carries description and ticket_type, and a contract or proposal template carries its template column.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
type String Template type
id Number Template unique ID inside that type
curl -X GET "https://yoursite.com/api/templates/lead/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "id": "1",
  "template_name": "login_info",
  "email_subject": "Login details",
  "default_message": "<div>Hello {USER_FIRST_NAME} ...</div>",
  "custom_message": "",
  "template_type": "default",
  "language": "",
  "deleted": "0"
}

Invalid-Type:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "type": "Invalid template type. Allowed values: email, ticket, contract, proposal" } }

No-Data:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Search Templates of a type (Read-Only)

GET/api/templates/{type}/search/{keyword}

Turns a template name into a template id. Email templates are matched on template_name and email_subject, ticket templates on title and description, contract and proposal templates on title. Bodies are not returned.

The default page size is 20 rows; send limit to ask for more, up to 500. The cap that was applied comes back in the X-Result-Limit response header, the ceiling in X-Result-Max-Limit, and X-Result-Truncated says whether the cap is what ended the list.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
type String Template type
keyword String Search keywords
limit Number optional Optional page size, 1 to 500. Defaults to 20
curl -X GET "https://yoursite.com/api/templates/lead/search/acme" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": "1",
    "template_name": "login_info",
    "email_subject": "Login details",
    "template_type": "default",
    "language": ""
  }
]

No-Data:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Custom Fields

List all Custom Field definitions

GET/api/custom-fields

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
related_to String optional Optional context filter. One of: clients, client_contacts, companies, contracts, estimates, events, expenses, invoices, items, leads, lead_contacts, orders, projects, project_files, proposals, subscriptions, tasks, team_members, tickets, timesheets
curl -X GET "https://yoursite.com/api/custom-fields" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "id": "3",
    "title": "Region",
    "title_language_key": "",
    "placeholder": "",
    "placeholder_language_key": "",
    "template_variable_name": "",
    "options": "North,South",
    "field_type": "select",
    "related_to": "clients",
    "sort": "1",
    "required": "0",
    "add_filter": "0",
    "show_in_table": "0",
    "show_in_invoice": "0",
    "show_in_estimate": "0",
    "show_in_contract": "0",
    "show_in_order": "0",
    "show_in_proposal": "0",
    "show_in_subscription": "0",
    "show_in_embedded_form": "0",
    "visible_to_admins_only": "0",
    "hide_from_clients": "0",
    "disable_editing_by_clients": "0",
    "show_on_kanban_card": "0",
    "deleted": "0"
  }
]

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Get Custom Field definition by ID

GET/api/custom-fields/{id}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
id Number Custom field unique ID
curl -X GET "https://yoursite.com/api/custom-fields/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "id": "3",
  "title": "Region",
  "options": "North,South",
  "field_type": "select",
  "related_to": "clients",
  "sort": "1",
  "required": "0",
  "deleted": "0"
}

Error-Response:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Get Custom Field values of a record

GET/api/custom-fields/values/{relatedTo}/{id}

Returns every custom field defined for the given context together with the value stored for the given record. Fields that have no stored value yet are returned with a null value.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
relatedTo String Context the record belongs to
id Number Unique ID of the record inside that context (e.g. the client id when relatedTo is clients)
curl -X GET "https://yoursite.com/api/custom-fields/values/lead/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
[
  {
    "custom_field_id": "3",
    "title": "Region",
    "title_language_key": "",
    "placeholder": "",
    "placeholder_language_key": "",
    "field_type": "select",
    "options": "North,South",
    "required": "0",
    "sort": "1",
    "related_to": "clients",
    "template_variable_name": "",
    "visible_to_admins_only": "0",
    "hide_from_clients": "0",
    "disable_editing_by_clients": "0",
    "show_on_kanban_card": "0",
    "custom_field_value_id": "17",
    "value": "North"
  },
  {
    "custom_field_id": "4",
    "title": "Renewal date",
    "field_type": "date",
    "options": "",
    "required": "0",
    "sort": "2",
    "related_to": "clients",
    "custom_field_value_id": null,
    "value": null
  }
]

Unknown-Record:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Invalid-Context:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "related_to": "Invalid context. Allowed values: clients, client_contacts, ..." } }

Set Custom Field values of a record

PUT/api/custom-fields/values/{relatedTo}/{id}

Creates or updates the custom field values of one record. Only the fields sent in the request are touched, the others keep their current value. Send an empty string to clear a value. Multi value fields (multi_select, checkboxes, multiple_choice) accept either a comma separated string or an array of options.

The record must exist in the given context, otherwise the request is answered with a 404. Every posted value is validated against its field definition before anything is written: a field marked as required cannot be cleared, and the value of a select, multi_select, multiple_choice or checkboxes field must be one of the options of that field. The whole request runs in one transaction, so either every value is saved or none of them is.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area

Parameters

FieldTypeDescription
relatedTo String Context the record belongs to
id Number Unique ID of the record inside that context
values Object Mandatory map of custom field id to value. A list of {"custom_field_id": .., "value": ..} objects is accepted as well.
curl -X PUT "https://yoursite.com/api/custom-fields/values/lead/123" \
  -H "authtoken: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "values": "..." }'

Success-Response:

HTTP/1.1 200 OK
{
  "status": 200,
  "messages": { "success": "Record saved" },
  "data": [
    { "custom_field_id": "3", "title": "Region", "field_type": "select", "value": "North" }
  ]
}

Unknown-Record:

HTTP/1.1 404 Not Found
{ "status": false, "messages": { "error": "No data were found" } }

Unknown-Field:

HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "custom_field_9": "Unknown custom field for the clients context." } }

Invalid-Value:

HTTP/1.1 400 Bad Request
{
  "status": false,
  "messages": {
    "custom_field_3": "Value not allowed. Allowed options: North, South",
    "custom_field_4": "This field is required.",
    "custom_field_5": "The value contains characters or keywords which are not allowed."
  }
}

Save-Failed:

HTTP/1.1 400 Bad Request
{
  "status": false,
  "messages": {
    "error": "None of the custom field values were saved, the whole request was rolled back.",
    "custom_field_3": "Could not be saved."
  }
}

Miscellaneous

List Client Groups

GET/api/client_groups

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/client_groups" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "title": "Test c group ",
  "deleted": "0"
	}

List Contact by ClientID

GET/api/contact_by_clientid/{clientid}

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/contact_by_clientid/123" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "6",
  "first_name": "Fname",
  "last_name": "Lname",
  "user_type": "client",
  "is_admin": "0",
  "role_id": "0",
  "email": "contact@email.pvt.ltd",
  "image": null,
  "status": "active",
  "message_checked_at": null,
  "client_id": "3",
  "notification_checked_at": null,
  "is_primary_contact": "0",
  "job_title": "HR",
  "disable_login": "0",
  "note": "",
  "address": null,
  "alternative_address": null,
  "phone": "1234567890",
  "alternative_phone": null,
  "dob": null,
  "ssn": null,
  "gender": "male",
  "sticky_note": null,
  "skype": "",
  "enable_web_notification": "1",
  "enable_email_notification": "1",
  "created_at": "2021-09-18 11:26:56",
  "last_online": null,
  "requested_account_removal": "0",
  "deleted": "0"
  "role_title": null,
  "date_of_hire": null,
  "salary": null,
  "salary_term": null
	}

List Invoice Labels

GET/api/invoice_labels

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/invoice_labels" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
    {
        "id": "2",
        "title": "title1",
        "color": "#aab7b7",
        "context": "invoice label 1",
        "user_id": "0",
        "deleted": "0"
    },
    {
        "id": "1",
        "title": "title2",
        "color": "#83c340",
        "context": "invoice label 2",
        "user_id": "0",
        "deleted": "0"
    }
]

List Invoice Taxes

GET/api/invoice_tax

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/invoice_tax" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "title": "Tax (10%)",
  "percentage": "10",
  "deleted": "0"
	}

List Project Labels

GET/api/project_labels

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/project_labels" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[{
  "id": "1",
  "title": "Hourly Project",
  "color": "#83c340",
  "context": "project",
  "user_id": "0",
  "deleted": "0"
	},
	{
  "id": "2",
  "title": "Fixed Project",
  "color": "#ffc310",
  "context": "project",
  "user_id": "0",
  "deleted": "0"
	}]

List Project Members

GET/api/project_members

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/project_members" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "6",
  "user_id": "1",
  "project_id": "1",
  "is_leader": "1",
  "deleted": "0",
  "member_name": "Fname Lname",
  "member_image": null,
  "job_title": "Admin",
  "user_type": "staff"     *
	}

List Staff Owner

GET/api/staff_owner

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/staff_owner" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "6",
  "first_name": "Fname",
  "last_name": "Lname",
  "user_type": "client",
  "is_admin": "0",
  "role_id": "0",
  "email": "contact@email.pvt.ltd",
  "image": null,
  "status": "active",
  "message_checked_at": null,
  "client_id": "3",
  "notification_checked_at": null,
  "is_primary_contact": "0",
  "job_title": "HR",
  "disable_login": "0",
  "note": "",
  "address": null,
  "alternative_address": null,
  "phone": "1234567890",
  "alternative_phone": null,
  "dob": null,
  "ssn": null,
  "gender": "male",
  "sticky_note": null,
  "skype": "",
  "enable_web_notification": "1",
  "enable_email_notification": "1",
  "created_at": "2021-09-18 11:26:56",
  "last_online": null,
  "requested_account_removal": "0",
  "deleted": "0"
  "role_title": null,
  "date_of_hire": null,
  "salary": null,
  "salary_term": null
	}

List Ticket Labels

GET/api/ticket_labels

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/ticket_labels" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

[
    {
        "id": "12",
        "title": "label 4",
        "color": "#e74c3c",
        "context": "ticket",
        "user_id": "0",
        "deleted": "0"
    },
    {
        "id": "11",
        "title": "label 4",
        "color": "#f1c40f",
        "context": "ticket",
        "user_id": "0",
        "deleted": "0"
    },
    {
        "id": "10",
        "title": "label 3",
        "color": "#29c2c2",
        "context": "ticket",
        "user_id": "0",
        "deleted": "0"
    },
    {
        "id": "9",
        "title": "label 2",
        "color": "#ad159e",
        "context": "ticket",
        "user_id": "0",
        "deleted": "0"
    }
]

List Ticket Types

GET/api/ticket_type

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/ticket_type" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

{
  "id": "1",
  "title": "General Support",
  "deleted": "0"
	}