# REST API for RISE CRM > Official reference for the REST API for RISE CRM (v2.1.0), a commercial RISE CRM plugin by Themesic Interactive. 322 documented endpoints across 54 sections, plus an MCP server for AI agents. ## Authentication Every request requires an `authtoken` HTTP header. Tokens are created in the RISE CRM admin area under the API item in the left sidebar. Each token has an expiration date and is bound to a single RISE CRM installation. Example: ``` curl -X GET "https://yoursite.com/index.php/api/clients" -H "authtoken: YOUR_API_TOKEN" ``` ## MCP - [GET /api/mcp](https://risecrm.themesic.com/apiguide/mcp/mcp-server-info/): 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. - [POST /api/mcp](https://risecrm.themesic.com/apiguide/mcp/mcp-server/): 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. ## Batch - [POST /api/batch](https://risecrm.themesic.com/apiguide/batch/run-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. ## Webhooks - [GET /api/webhooks](https://risecrm.themesic.com/apiguide/webhooks/get-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. - [POST /api/webhooks](https://risecrm.themesic.com/apiguide/webhooks/create-webhook/): 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=,v1= . 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. - [DELETE /api/webhooks/{id}](https://risecrm.themesic.com/apiguide/webhooks/delete-webhook/): 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. - [GET /api/webhooks/{id}](https://risecrm.themesic.com/apiguide/webhooks/show-webhook/): 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. - [PUT /api/webhooks/{id}](https://risecrm.themesic.com/apiguide/webhooks/update-webhook/): 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. - [GET /api/webhooks/{id}/logs](https://risecrm.themesic.com/apiguide/webhooks/get-webhook-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. - [POST /api/webhooks/{id}/toggle](https://risecrm.themesic.com/apiguide/webhooks/toggle-webhook/): 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. - [GET /api/webhooks/events](https://risecrm.themesic.com/apiguide/webhooks/get-webhook-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 .created , .updated and .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. ## Automation - [GET /api/automation/poll/{resource}](https://risecrm.themesic.com/apiguide/automation/poll-automation-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. - [GET /api/automation/resources](https://risecrm.themesic.com/apiguide/automation/get-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. - [GET /api/automation/sample/{resource}](https://risecrm.themesic.com/apiguide/automation/get-automation-sample/): 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. ## OpenAPI - [GET /api/openapi.json](https://risecrm.themesic.com/apiguide/open-api/get-open-api-spec/): 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. ## Tooling - [GET /api/playground](https://risecrm.themesic.com/apiguide/tooling/get-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. - [GET /api/postman.json](https://risecrm.themesic.com/apiguide/tooling/get-postman-collection/): 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. - [GET /api/swagger](https://risecrm.themesic.com/apiguide/tooling/get-swagger-playground/): 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. ## Reporting - [GET /api/reports](https://risecrm.themesic.com/apiguide/reporting/get-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. - [GET /api/reports/invoices](https://risecrm.themesic.com/apiguide/reporting/get-report-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. - [GET /api/reports/projects](https://risecrm.themesic.com/apiguide/reporting/get-report-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. - [GET /api/reports/summary](https://risecrm.themesic.com/apiguide/reporting/get-report-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. - [GET /api/reports/timesheets](https://risecrm.themesic.com/apiguide/reporting/get-report-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. ## Users - [GET /api/users](https://risecrm.themesic.com/apiguide/users/get-users/): List all Users - [POST /api/users](https://risecrm.themesic.com/apiguide/users/create-user/): Add New User - [DELETE /api/users/{id}](https://risecrm.themesic.com/apiguide/users/delete-user/): Delete a User - [GET /api/users/{id}](https://risecrm.themesic.com/apiguide/users/show-user/): Get User by ID - [PUT /api/users/{id}](https://risecrm.themesic.com/apiguide/users/update-user/): Update a User - [GET /api/users/search/{keyword}](https://risecrm.themesic.com/apiguide/users/search-users/): Search Users ## Leads - [GET /api/leads](https://risecrm.themesic.com/apiguide/leads/get-leads/): List all Leads - [POST /api/leads](https://risecrm.themesic.com/apiguide/leads/create-lead/): Add New Lead - [DELETE /api/leads/{id}](https://risecrm.themesic.com/apiguide/leads/delete-lead/): Delete a Lead - [GET /api/leads/{id}](https://risecrm.themesic.com/apiguide/leads/show-lead/): Get Lead by ID - [PUT /api/leads/{id}](https://risecrm.themesic.com/apiguide/leads/update-lead/): Update a Lead - [GET /api/leads/search/{keyword}](https://risecrm.themesic.com/apiguide/leads/search-leads/): Search Leads ## Clients - [GET /api/clients](https://risecrm.themesic.com/apiguide/clients/get-clients/): List all Clients - [POST /api/clients](https://risecrm.themesic.com/apiguide/clients/create-client/): Add New Client - [DELETE /api/clients/{id}](https://risecrm.themesic.com/apiguide/clients/delete-client/): Delete a Client - [GET /api/clients/{id}](https://risecrm.themesic.com/apiguide/clients/show-client/): Get Client by ID - [PUT /api/clients/{id}](https://risecrm.themesic.com/apiguide/clients/update-client/): Update a Client - [GET /api/clients/search/{keyword}](https://risecrm.themesic.com/apiguide/clients/search-clients/): Search Clients ## Projects - [GET /api/projects](https://risecrm.themesic.com/apiguide/projects/get-projects/): List all Projects - [POST /api/projects](https://risecrm.themesic.com/apiguide/projects/create-project/): Add New Project - [DELETE /api/projects/{id}](https://risecrm.themesic.com/apiguide/projects/delete-project/): Delete a Project - [GET /api/projects/{id}](https://risecrm.themesic.com/apiguide/projects/show-project/): Get Project by ID - [PUT /api/projects/{id}](https://risecrm.themesic.com/apiguide/projects/update-project/): Update a Project - [GET /api/projects/search/{keyword}](https://risecrm.themesic.com/apiguide/projects/search-projects/): Search Projects ## Tasks - [GET /api/tasks](https://risecrm.themesic.com/apiguide/tasks/get-tasks/): List all Tasks - [POST /api/tasks](https://risecrm.themesic.com/apiguide/tasks/create-task/): Add New Task - [DELETE /api/tasks/{id}](https://risecrm.themesic.com/apiguide/tasks/delete-task/): Delete a Task - [GET /api/tasks/{id}](https://risecrm.themesic.com/apiguide/tasks/show-task/): Get Task by ID - [PUT /api/tasks/{id}](https://risecrm.themesic.com/apiguide/tasks/update-task/): Update a Task - [GET /api/tasks/search/{keyword}](https://risecrm.themesic.com/apiguide/tasks/search-tasks/): Search Tasks ## Milestones - [GET /api/milestones](https://risecrm.themesic.com/apiguide/milestones/get-milestones/): List all Milestones - [POST /api/milestones](https://risecrm.themesic.com/apiguide/milestones/create-milestone/): Add New Milestone - [DELETE /api/milestones/{id}](https://risecrm.themesic.com/apiguide/milestones/delete-milestone/): Delete a Milestone - [GET /api/milestones/{id}](https://risecrm.themesic.com/apiguide/milestones/show-milestone/): Get Milestone by ID - [PUT /api/milestones/{id}](https://risecrm.themesic.com/apiguide/milestones/update-milestone/): Update a Milestone - [GET /api/milestones/search/{keyword}](https://risecrm.themesic.com/apiguide/milestones/search-milestones/): Search Milestones ## Project Comments - [GET /api/project-comments](https://risecrm.themesic.com/apiguide/project-comments/get-project-comments/): List all Project Comments - [POST /api/project-comments](https://risecrm.themesic.com/apiguide/project-comments/create-project-comment/): Add Project Comment - [DELETE /api/project-comments/{id}](https://risecrm.themesic.com/apiguide/project-comments/delete-project-comment/): Delete Project Comment - [GET /api/project-comments/{id}](https://risecrm.themesic.com/apiguide/project-comments/show-project-comment/): Get Project Comment by ID - [PUT /api/project-comments/{id}](https://risecrm.themesic.com/apiguide/project-comments/update-project-comment/): Update Project Comment - [GET /api/project-comments/search/{keyword}](https://risecrm.themesic.com/apiguide/project-comments/search-project-comments/): Search Project Comments ## Tickets - [GET /api/tickets](https://risecrm.themesic.com/apiguide/tickets/get-tickets/): List all Tickets - [POST /api/tickets](https://risecrm.themesic.com/apiguide/tickets/create-ticket/): Add New Ticket - [DELETE /api/tickets/{id}](https://risecrm.themesic.com/apiguide/tickets/delete-ticket/): Delete a Ticket - [GET /api/tickets/{id}](https://risecrm.themesic.com/apiguide/tickets/show-ticket/): Get Ticket by ID - [PUT /api/tickets/{id}](https://risecrm.themesic.com/apiguide/tickets/update-ticket/): Update a Ticket - [GET /api/tickets/search/{keyword}](https://risecrm.themesic.com/apiguide/tickets/search-tickets/): Search Tickets ## Ticket Comments - [GET /api/ticket-comments](https://risecrm.themesic.com/apiguide/ticket-comments/get-ticket-comments/): List all Ticket Comments - [POST /api/ticket-comments](https://risecrm.themesic.com/apiguide/ticket-comments/create-ticket-comment/): Add Ticket Comment - [DELETE /api/ticket-comments/{id}](https://risecrm.themesic.com/apiguide/ticket-comments/delete-ticket-comment/): Delete Ticket Comment - [GET /api/ticket-comments/{id}](https://risecrm.themesic.com/apiguide/ticket-comments/show-ticket-comment/): Get Ticket Comment by ID - [PUT /api/ticket-comments/{id}](https://risecrm.themesic.com/apiguide/ticket-comments/update-ticket-comment/): Update Ticket Comment - [GET /api/ticket-comments/search/{keyword}](https://risecrm.themesic.com/apiguide/ticket-comments/search-ticket-comments/): Search Ticket Comments ## Invoices - [GET /api/invoices](https://risecrm.themesic.com/apiguide/invoices/get-invoices/): List all Invoices - [POST /api/invoices](https://risecrm.themesic.com/apiguide/invoices/create-invoice/): Add an Invoice - [DELETE /api/invoices/{id}](https://risecrm.themesic.com/apiguide/invoices/delete-invoice/): Delete an Invoice - [GET /api/invoices/{id}](https://risecrm.themesic.com/apiguide/invoices/show-invoice/): Get Invoice by ID - [PUT /api/invoices/{id}](https://risecrm.themesic.com/apiguide/invoices/update-invoice/): Edit an Invoice - [GET /api/invoices/search/{keyword}](https://risecrm.themesic.com/apiguide/invoices/search-invoices/): Search Invoices ## Invoice Payments - [GET /api/invoice-payments](https://risecrm.themesic.com/apiguide/invoice-payments/get-invoice-payments/): List all Invoice Payments - [POST /api/invoice-payments](https://risecrm.themesic.com/apiguide/invoice-payments/create-invoice-payment/): Add Invoice Payment - [DELETE /api/invoice-payments/{id}](https://risecrm.themesic.com/apiguide/invoice-payments/delete-invoice-payment/): Delete Invoice Payment - [GET /api/invoice-payments/{id}](https://risecrm.themesic.com/apiguide/invoice-payments/show-invoice-payment/): Get Invoice Payment by ID - [PUT /api/invoice-payments/{id}](https://risecrm.themesic.com/apiguide/invoice-payments/update-invoice-payment/): Update Invoice Payment - [GET /api/invoice-payments/search/{keyword}](https://risecrm.themesic.com/apiguide/invoice-payments/search-invoice-payments/): Search Invoice Payments ## Expenses - [GET /api/expenses](https://risecrm.themesic.com/apiguide/expenses/get-expenses/): List all Expenses - [POST /api/expenses](https://risecrm.themesic.com/apiguide/expenses/create-expense/): Add New Expense - [DELETE /api/expenses/{id}](https://risecrm.themesic.com/apiguide/expenses/delete-expense/): Delete an Expense - [GET /api/expenses/{id}](https://risecrm.themesic.com/apiguide/expenses/show-expense/): Get Expense by ID - [PUT /api/expenses/{id}](https://risecrm.themesic.com/apiguide/expenses/update-expense/): Update an Expense - [GET /api/expenses/search/{keyword}](https://risecrm.themesic.com/apiguide/expenses/search-expenses/): Search Expenses ## Estimates - [GET /api/estimates](https://risecrm.themesic.com/apiguide/estimates/get-estimates/): List all Estimates - [POST /api/estimates](https://risecrm.themesic.com/apiguide/estimates/create-estimate/): Add New Estimate - [DELETE /api/estimates/{id}](https://risecrm.themesic.com/apiguide/estimates/delete-estimate/): Delete an Estimate - [GET /api/estimates/{id}](https://risecrm.themesic.com/apiguide/estimates/show-estimate/): Get Estimate by ID - [PUT /api/estimates/{id}](https://risecrm.themesic.com/apiguide/estimates/update-estimate/): Update an Estimate - [GET /api/estimates/search/{keyword}](https://risecrm.themesic.com/apiguide/estimates/search-estimates/): Search Estimates ## Estimate Requests - [GET /api/estimate-requests](https://risecrm.themesic.com/apiguide/estimate-requests/get-estimate-requests/): List all Estimate Requests - [POST /api/estimate-requests](https://risecrm.themesic.com/apiguide/estimate-requests/create-estimate-request/): Add New Estimate Request - [DELETE /api/estimate-requests/{id}](https://risecrm.themesic.com/apiguide/estimate-requests/delete-estimate-request/): Delete an Estimate Request - [GET /api/estimate-requests/{id}](https://risecrm.themesic.com/apiguide/estimate-requests/show-estimate-request/): Get Estimate Request by ID - [PUT /api/estimate-requests/{id}](https://risecrm.themesic.com/apiguide/estimate-requests/update-estimate-request/): Update an Estimate Request - [GET /api/estimate-requests/search/{keyword}](https://risecrm.themesic.com/apiguide/estimate-requests/search-estimate-requests/): Search Estimate Requests ## Taxes - [GET /api/taxes](https://risecrm.themesic.com/apiguide/taxes/get-taxes/): List all Taxes - [POST /api/taxes](https://risecrm.themesic.com/apiguide/taxes/create-tax/): Add New Tax - [DELETE /api/taxes/{id}](https://risecrm.themesic.com/apiguide/taxes/delete-tax/): Delete a Tax - [GET /api/taxes/{id}](https://risecrm.themesic.com/apiguide/taxes/show-tax/): Get Tax by ID - [PUT /api/taxes/{id}](https://risecrm.themesic.com/apiguide/taxes/update-tax/): Update a Tax - [GET /api/taxes/search/{keyword}](https://risecrm.themesic.com/apiguide/taxes/search-taxes/): Search Taxes ## Items - [GET /api/items](https://risecrm.themesic.com/apiguide/items/get-items/): List all Items - [POST /api/items](https://risecrm.themesic.com/apiguide/items/create-item/): Add New Item - [DELETE /api/items/{id}](https://risecrm.themesic.com/apiguide/items/delete-item/): Delete an Item - [GET /api/items/{id}](https://risecrm.themesic.com/apiguide/items/show-item/): Get Item by ID - [PUT /api/items/{id}](https://risecrm.themesic.com/apiguide/items/update-item/): Update an Item - [GET /api/items/search/{keyword}](https://risecrm.themesic.com/apiguide/items/search-items/): Search Items ## Item Categories - [GET /api/item-categories](https://risecrm.themesic.com/apiguide/item-categories/get-item-categories/): List all Item Categories - [POST /api/item-categories](https://risecrm.themesic.com/apiguide/item-categories/create-item-category/): Add New Item Category - [DELETE /api/item-categories/{id}](https://risecrm.themesic.com/apiguide/item-categories/delete-item-category/): Delete an Item Category - [GET /api/item-categories/{id}](https://risecrm.themesic.com/apiguide/item-categories/show-item-category/): Get Item Category by ID - [PUT /api/item-categories/{id}](https://risecrm.themesic.com/apiguide/item-categories/update-item-category/): Update an Item Category - [GET /api/item-categories/search/{keyword}](https://risecrm.themesic.com/apiguide/item-categories/search-item-categories/): Search Item Categories ## Contacts - [GET /api/contacts](https://risecrm.themesic.com/apiguide/contacts/get-contacts/): List all Contacts - [POST /api/contacts](https://risecrm.themesic.com/apiguide/contacts/create-contact/): Add New Contact - [DELETE /api/contacts/{id}](https://risecrm.themesic.com/apiguide/contacts/delete-contact/): Delete a Contact - [GET /api/contacts/{id}](https://risecrm.themesic.com/apiguide/contacts/show-contact/): Get Contact by ID - [PUT /api/contacts/{id}](https://risecrm.themesic.com/apiguide/contacts/update-contact/): Update a Contact - [GET /api/contacts/search/{keyword}](https://risecrm.themesic.com/apiguide/contacts/search-contacts/): Search Contacts ## Subscriptions - [GET /api/subscriptions](https://risecrm.themesic.com/apiguide/subscriptions/get-subscriptions/): List all Subscriptions - [POST /api/subscriptions](https://risecrm.themesic.com/apiguide/subscriptions/create-subscription/): Add New Subscription - [DELETE /api/subscriptions/{id}](https://risecrm.themesic.com/apiguide/subscriptions/delete-subscription/): Delete a Subscription - [GET /api/subscriptions/{id}](https://risecrm.themesic.com/apiguide/subscriptions/show-subscription/): Get Subscription by ID - [PUT /api/subscriptions/{id}](https://risecrm.themesic.com/apiguide/subscriptions/update-subscription/): Update a Subscription - [GET /api/subscriptions/search/{keyword}](https://risecrm.themesic.com/apiguide/subscriptions/search-subscriptions/): Search Subscriptions ## Timesheets - [GET /api/timesheets](https://risecrm.themesic.com/apiguide/timesheets/get-timesheets/): List all Timesheets - [POST /api/timesheets](https://risecrm.themesic.com/apiguide/timesheets/create-timesheet/): Add New Timesheet - [DELETE /api/timesheets/{id}](https://risecrm.themesic.com/apiguide/timesheets/delete-timesheet/): Delete a Timesheet - [GET /api/timesheets/{id}](https://risecrm.themesic.com/apiguide/timesheets/show-timesheet/): Get Timesheet by ID - [PUT /api/timesheets/{id}](https://risecrm.themesic.com/apiguide/timesheets/update-timesheet/): Update a Timesheet - [GET /api/timesheets/search/{keyword}](https://risecrm.themesic.com/apiguide/timesheets/search-timesheets/): Search Timesheets ## Expense Categories - [GET /api/expense-categories](https://risecrm.themesic.com/apiguide/expense-categories/get-expense-categories/): List all Expense Categories - [POST /api/expense-categories](https://risecrm.themesic.com/apiguide/expense-categories/create-expense-category/): Add New Expense Category - [DELETE /api/expense-categories/{id}](https://risecrm.themesic.com/apiguide/expense-categories/delete-expense-category/): Delete an Expense Category - [GET /api/expense-categories/{id}](https://risecrm.themesic.com/apiguide/expense-categories/show-expense-category/): Get Expense Category by ID - [PUT /api/expense-categories/{id}](https://risecrm.themesic.com/apiguide/expense-categories/update-expense-category/): Update an Expense Category - [GET /api/expense-categories/search/{keyword}](https://risecrm.themesic.com/apiguide/expense-categories/search-expense-categories/): Search Expense Categories ## Labels - [GET /api/labels](https://risecrm.themesic.com/apiguide/labels/get-labels/): List all Labels - [POST /api/labels](https://risecrm.themesic.com/apiguide/labels/create-label/): Add New Label - [DELETE /api/labels/{id}](https://risecrm.themesic.com/apiguide/labels/delete-label/): Delete a Label - [GET /api/labels/{id}](https://risecrm.themesic.com/apiguide/labels/show-label/): Get Label by ID - [PUT /api/labels/{id}](https://risecrm.themesic.com/apiguide/labels/update-label/): Update a Label - [GET /api/labels/search/{keyword}](https://risecrm.themesic.com/apiguide/labels/search-labels/): Search Labels ## Proposals - [GET /api/proposals](https://risecrm.themesic.com/apiguide/proposals/get-proposals/): List all Proposals - [POST /api/proposals](https://risecrm.themesic.com/apiguide/proposals/create-proposal/): Add New Proposal - [DELETE /api/proposals/{id}](https://risecrm.themesic.com/apiguide/proposals/delete-proposal/): Delete a Proposal - [GET /api/proposals/{id}](https://risecrm.themesic.com/apiguide/proposals/show-proposal/): Get Proposal by ID - [PUT /api/proposals/{id}](https://risecrm.themesic.com/apiguide/proposals/update-proposal/): Update a Proposal - [GET /api/proposals/search/{keyword}](https://risecrm.themesic.com/apiguide/proposals/search-proposals/): Search Proposals ## Orders - [GET /api/orders](https://risecrm.themesic.com/apiguide/orders/get-orders/): List all Orders - [POST /api/orders](https://risecrm.themesic.com/apiguide/orders/create-order/): Add New Order - [DELETE /api/orders/{id}](https://risecrm.themesic.com/apiguide/orders/delete-order/): Delete an Order - [GET /api/orders/{id}](https://risecrm.themesic.com/apiguide/orders/show-order/): Get Order by ID - [PUT /api/orders/{id}](https://risecrm.themesic.com/apiguide/orders/update-order/): Update an Order - [GET /api/orders/search/{keyword}](https://risecrm.themesic.com/apiguide/orders/search-orders/): Search Orders ## Contracts - [GET /api/contracts](https://risecrm.themesic.com/apiguide/contracts/get-contracts/): List all Contracts - [POST /api/contracts](https://risecrm.themesic.com/apiguide/contracts/create-contract/): Add New Contract - [DELETE /api/contracts/{id}](https://risecrm.themesic.com/apiguide/contracts/delete-contract/): Delete a Contract - [GET /api/contracts/{id}](https://risecrm.themesic.com/apiguide/contracts/show-contract/): Get Contract by ID - [PUT /api/contracts/{id}](https://risecrm.themesic.com/apiguide/contracts/update-contract/): Update a Contract - [GET /api/contracts/search/{keyword}](https://risecrm.themesic.com/apiguide/contracts/search-contracts/): Search Contracts ## Messages - [GET /api/messages](https://risecrm.themesic.com/apiguide/messages/get-messages/): List all Messages - [POST /api/messages](https://risecrm.themesic.com/apiguide/messages/create-message/): Add New Message - [DELETE /api/messages/{id}](https://risecrm.themesic.com/apiguide/messages/delete-message/): Delete a Message - [GET /api/messages/{id}](https://risecrm.themesic.com/apiguide/messages/show-message/): Get Message by ID - [PUT /api/messages/{id}](https://risecrm.themesic.com/apiguide/messages/update-message/): Update a Message - [GET /api/messages/search/{keyword}](https://risecrm.themesic.com/apiguide/messages/search-messages/): Search Messages ## Notes - [GET /api/notes](https://risecrm.themesic.com/apiguide/notes/get-notes/): List all Notes - [POST /api/notes](https://risecrm.themesic.com/apiguide/notes/create-note/): Add New Note - [DELETE /api/notes/{id}](https://risecrm.themesic.com/apiguide/notes/delete-note/): Delete a Note - [GET /api/notes/{id}](https://risecrm.themesic.com/apiguide/notes/show-note/): Get Note by ID - [PUT /api/notes/{id}](https://risecrm.themesic.com/apiguide/notes/update-note/): Update a Note - [GET /api/notes/search/{keyword}](https://risecrm.themesic.com/apiguide/notes/search-notes/): Search Notes ## Events - [GET /api/events](https://risecrm.themesic.com/apiguide/events/get-events/): List all Events - [POST /api/events](https://risecrm.themesic.com/apiguide/events/create-event/): Add New Event - [DELETE /api/events/{id}](https://risecrm.themesic.com/apiguide/events/delete-event/): Delete an Event - [GET /api/events/{id}](https://risecrm.themesic.com/apiguide/events/show-event/): Get Event by ID - [PUT /api/events/{id}](https://risecrm.themesic.com/apiguide/events/update-event/): Update an Event - [GET /api/events/search/{keyword}](https://risecrm.themesic.com/apiguide/events/search-events/): Search Events ## Announcements - [GET /api/announcements](https://risecrm.themesic.com/apiguide/announcements/get-announcements/): List all Announcements - [POST /api/announcements](https://risecrm.themesic.com/apiguide/announcements/create-announcement/): Add New Announcement - [DELETE /api/announcements/{id}](https://risecrm.themesic.com/apiguide/announcements/delete-announcement/): Delete an Announcement - [GET /api/announcements/{id}](https://risecrm.themesic.com/apiguide/announcements/show-announcement/): Get Announcement by ID - [PUT /api/announcements/{id}](https://risecrm.themesic.com/apiguide/announcements/update-announcement/): Update an Announcement - [GET /api/announcements/search/{keyword}](https://risecrm.themesic.com/apiguide/announcements/search-announcements/): Search Announcements ## Leave Applications - [GET /api/leave-applications](https://risecrm.themesic.com/apiguide/leave-applications/get-leave-applications/): List all Leave Applications - [POST /api/leave-applications](https://risecrm.themesic.com/apiguide/leave-applications/create-leave-application/): Add Leave Application - [DELETE /api/leave-applications/{id}](https://risecrm.themesic.com/apiguide/leave-applications/delete-leave-application/): Delete Leave Application - [GET /api/leave-applications/{id}](https://risecrm.themesic.com/apiguide/leave-applications/show-leave-application/): Get Leave Application by ID - [PUT /api/leave-applications/{id}](https://risecrm.themesic.com/apiguide/leave-applications/update-leave-application/): Update Leave Application - [GET /api/leave-applications/search/{keyword}](https://risecrm.themesic.com/apiguide/leave-applications/search-leave-applications/): Search Leave Applications ## To Do - [GET /api/todos](https://risecrm.themesic.com/apiguide/to-do/get-to-dos/): List all ToDo Items - [POST /api/todos](https://risecrm.themesic.com/apiguide/to-do/create-to-do/): Add New ToDo Item - [DELETE /api/todos/{id}](https://risecrm.themesic.com/apiguide/to-do/delete-to-do/): Delete a ToDo Item - [GET /api/todos/{id}](https://risecrm.themesic.com/apiguide/to-do/show-to-do/): Get ToDo by ID - [PUT /api/todos/{id}](https://risecrm.themesic.com/apiguide/to-do/update-to-do/): Update a ToDo Item - [GET /api/todos/search/{keyword}](https://risecrm.themesic.com/apiguide/to-do/search-to-dos/): Search ToDo Items ## Attendance - [GET /api/attendance](https://risecrm.themesic.com/apiguide/attendance/get-attendance/): List all Attendance Records - [POST /api/attendance](https://risecrm.themesic.com/apiguide/attendance/create-attendance/): Add Attendance Record - [DELETE /api/attendance/{id}](https://risecrm.themesic.com/apiguide/attendance/delete-attendance/): Delete Attendance - [GET /api/attendance/{id}](https://risecrm.themesic.com/apiguide/attendance/show-attendance/): Get Attendance by ID - [PUT /api/attendance/{id}](https://risecrm.themesic.com/apiguide/attendance/update-attendance/): Update Attendance - [GET /api/attendance/search/{keyword}](https://risecrm.themesic.com/apiguide/attendance/search-attendance/): Search Attendance ## Payment Methods - [GET /api/payment-methods](https://risecrm.themesic.com/apiguide/payment-methods/get-payment-methods/): List all Payment Methods - [POST /api/payment-methods](https://risecrm.themesic.com/apiguide/payment-methods/create-payment-method/): Add Payment Method - [DELETE /api/payment-methods/{id}](https://risecrm.themesic.com/apiguide/payment-methods/delete-payment-method/): Delete Payment Method - [GET /api/payment-methods/{id}](https://risecrm.themesic.com/apiguide/payment-methods/show-payment-method/): Get Payment Method by ID - [PUT /api/payment-methods/{id}](https://risecrm.themesic.com/apiguide/payment-methods/update-payment-method/): Update Payment Method - [GET /api/payment-methods/search/{keyword}](https://risecrm.themesic.com/apiguide/payment-methods/search-payment-methods/): Search Payment Methods ## Notifications - [GET /api/notifications](https://risecrm.themesic.com/apiguide/notifications/get-notifications/): List all Notifications - [POST /api/notifications](https://risecrm.themesic.com/apiguide/notifications/create-notification/): Add Notification - [DELETE /api/notifications/{id}](https://risecrm.themesic.com/apiguide/notifications/delete-notification/): Delete Notification - [GET /api/notifications/{id}](https://risecrm.themesic.com/apiguide/notifications/show-notification/): Get Notification by ID - [PUT /api/notifications/{id}](https://risecrm.themesic.com/apiguide/notifications/update-notification/): Update Notification (Mark as Read) - [GET /api/notifications/search/{keyword}](https://risecrm.themesic.com/apiguide/notifications/search-notifications/): Search Notifications ## Activity Logs - [GET /api/activity-logs](https://risecrm.themesic.com/apiguide/activity-logs/get-activity-logs/): Read-only endpoint for audit trail viewing - [GET /api/activity-logs/{id}](https://risecrm.themesic.com/apiguide/activity-logs/show-activity-log/): Get Activity Log by ID (Read-Only) - [GET /api/activity-logs/search/{keyword}](https://risecrm.themesic.com/apiguide/activity-logs/search-activity-logs/): Search Activity Logs ## Line Items - [GET /api/{parent}/{id}/items](https://risecrm.themesic.com/apiguide/line-items/list-line-items/): List the lines of a document - [POST /api/{parent}/{id}/items](https://risecrm.themesic.com/apiguide/line-items/create-line-item/): Append a line to a document - [PUT /api/{parent}/{id}/items](https://risecrm.themesic.com/apiguide/line-items/replace-line-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. - [DELETE /api/{parent}/{id}/items/{itemId}](https://risecrm.themesic.com/apiguide/line-items/delete-line-item/): Delete one line of a document ## Knowledge Base - [GET /api/knowledge-base/articles](https://risecrm.themesic.com/apiguide/knowledge-base/get-knowledge-base-articles/): List Knowledge Base Articles - [POST /api/knowledge-base/articles](https://risecrm.themesic.com/apiguide/knowledge-base/create-knowledge-base-article/): Add New Article - [DELETE /api/knowledge-base/articles/{id}](https://risecrm.themesic.com/apiguide/knowledge-base/delete-knowledge-base-article/): Delete an Article - [GET /api/knowledge-base/articles/{id}](https://risecrm.themesic.com/apiguide/knowledge-base/show-knowledge-base-article/): Get Article by ID - [PUT /api/knowledge-base/articles/{id}](https://risecrm.themesic.com/apiguide/knowledge-base/update-knowledge-base-article/): Update an Article - [GET /api/knowledge-base/articles/{id}/helpful](https://risecrm.themesic.com/apiguide/knowledge-base/get-knowledge-base-article-feedback/): Get Article Feedback Counters - [POST /api/knowledge-base/articles/{id}/helpful](https://risecrm.themesic.com/apiguide/knowledge-base/create-knowledge-base-article-feedback/): Record Article Feedback - [GET /api/knowledge-base/articles/search/{keyword}](https://risecrm.themesic.com/apiguide/knowledge-base/search-knowledge-base-articles/): Search Articles - [GET /api/knowledge-base/categories](https://risecrm.themesic.com/apiguide/knowledge-base/get-knowledge-base-categories/): List Knowledge Base Categories - [POST /api/knowledge-base/categories](https://risecrm.themesic.com/apiguide/knowledge-base/create-knowledge-base-category/): Add New Category - [DELETE /api/knowledge-base/categories/{id}](https://risecrm.themesic.com/apiguide/knowledge-base/delete-knowledge-base-category/): Delete a Category - [GET /api/knowledge-base/categories/{id}](https://risecrm.themesic.com/apiguide/knowledge-base/show-knowledge-base-category/): Get Category by ID - [PUT /api/knowledge-base/categories/{id}](https://risecrm.themesic.com/apiguide/knowledge-base/update-knowledge-base-category/): Update a Category - [GET /api/knowledge-base/categories/search/{keyword}](https://risecrm.themesic.com/apiguide/knowledge-base/search-knowledge-base-categories/): Search Categories ## Checklists - [GET /api/checklists/groups](https://risecrm.themesic.com/apiguide/checklists/get-checklist-groups/): List Checklist Groups - [POST /api/checklists/groups](https://risecrm.themesic.com/apiguide/checklists/create-checklist-group/): Add Checklist Group - [DELETE /api/checklists/groups/{id}](https://risecrm.themesic.com/apiguide/checklists/delete-checklist-group/): Delete a Checklist Group - [GET /api/checklists/groups/{id}](https://risecrm.themesic.com/apiguide/checklists/show-checklist-group/): Get Checklist Group by ID - [PUT /api/checklists/groups/{id}](https://risecrm.themesic.com/apiguide/checklists/update-checklist-group/): Update a Checklist Group - [GET /api/checklists/groups/{id}/templates](https://risecrm.themesic.com/apiguide/checklists/get-checklist-group-templates/): List Templates of a Checklist Group - [GET /api/checklists/groups/search/{keyword}](https://risecrm.themesic.com/apiguide/checklists/search-checklist-groups/): Search Checklist Groups - [GET /api/checklists/items](https://risecrm.themesic.com/apiguide/checklists/get-checklist-items/): List Checklist Items of a Task - [POST /api/checklists/items](https://risecrm.themesic.com/apiguide/checklists/create-checklist-item/): Add Checklist Item to a Task - [DELETE /api/checklists/items/{id}](https://risecrm.themesic.com/apiguide/checklists/delete-checklist-item/): Delete a Checklist Item - [GET /api/checklists/items/{id}](https://risecrm.themesic.com/apiguide/checklists/show-checklist-item/): Get Checklist Item by ID - [PUT /api/checklists/items/{id}](https://risecrm.themesic.com/apiguide/checklists/update-checklist-item/): Update a Checklist Item - [POST /api/checklists/items/apply-group](https://risecrm.themesic.com/apiguide/checklists/apply-checklist-group/): Copies every template of the group onto the task as new checklist items, the same way the task detail screen does it. - [GET /api/checklists/items/search/{keyword}](https://risecrm.themesic.com/apiguide/checklists/search-checklist-items/): Search Checklist Items - [GET /api/checklists/tasks/{task_id}/summary](https://risecrm.themesic.com/apiguide/checklists/get-task-checklist-summary/): Get Checklist Progress of a Task - [GET /api/checklists/templates](https://risecrm.themesic.com/apiguide/checklists/get-checklist-templates/): List Checklist Templates - [POST /api/checklists/templates](https://risecrm.themesic.com/apiguide/checklists/create-checklist-template/): Add Checklist Template - [DELETE /api/checklists/templates/{id}](https://risecrm.themesic.com/apiguide/checklists/delete-checklist-template/): Delete a Checklist Template - [GET /api/checklists/templates/{id}](https://risecrm.themesic.com/apiguide/checklists/show-checklist-template/): Get Checklist Template by ID - [PUT /api/checklists/templates/{id}](https://risecrm.themesic.com/apiguide/checklists/update-checklist-template/): Update a Checklist Template - [GET /api/checklists/templates/search/{keyword}](https://risecrm.themesic.com/apiguide/checklists/search-checklist-templates/): Search Checklist Templates ## Files - [GET /api/files](https://risecrm.themesic.com/apiguide/files/get-files/): List Files of a context - [POST /api/files](https://risecrm.themesic.com/apiguide/files/create-file/): 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. - [DELETE /api/files/{source}/{id}](https://risecrm.themesic.com/apiguide/files/delete-file/): 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. - [GET /api/files/{source}/{id}](https://risecrm.themesic.com/apiguide/files/show-file/): Get File metadata by source and ID - [GET /api/files/{source}/{id}/download](https://risecrm.themesic.com/apiguide/files/download-file/): 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. - [GET /api/files/categories](https://risecrm.themesic.com/apiguide/files/get-file-categories/): List File Categories - [GET /api/files/folders](https://risecrm.themesic.com/apiguide/files/get-file-folders/): List Folders - [GET /api/files/search/{keyword}](https://risecrm.themesic.com/apiguide/files/search-files/): Search Files ## Estimate Comments - [GET /api/estimate-comments](https://risecrm.themesic.com/apiguide/estimate-comments/get-estimate-comments/): List all Estimate Comments - [POST /api/estimate-comments](https://risecrm.themesic.com/apiguide/estimate-comments/create-estimate-comment/): Add Estimate Comment - [DELETE /api/estimate-comments/{id}](https://risecrm.themesic.com/apiguide/estimate-comments/delete-estimate-comment/): Delete Estimate Comment - [GET /api/estimate-comments/{id}](https://risecrm.themesic.com/apiguide/estimate-comments/show-estimate-comment/): Get Estimate Comment by ID - [PUT /api/estimate-comments/{id}](https://risecrm.themesic.com/apiguide/estimate-comments/update-estimate-comment/): Update Estimate Comment - [GET /api/estimate-comments/search/{keyword}](https://risecrm.themesic.com/apiguide/estimate-comments/search-estimate-comments/): Search Estimate Comments ## Proposal Comments - [GET /api/proposal-comments](https://risecrm.themesic.com/apiguide/proposal-comments/get-proposal-comments/): List all Proposal Comments - [POST /api/proposal-comments](https://risecrm.themesic.com/apiguide/proposal-comments/create-proposal-comment/): Add Proposal Comment - [DELETE /api/proposal-comments/{id}](https://risecrm.themesic.com/apiguide/proposal-comments/delete-proposal-comment/): Delete Proposal Comment - [GET /api/proposal-comments/{id}](https://risecrm.themesic.com/apiguide/proposal-comments/show-proposal-comment/): Get Proposal Comment by ID - [PUT /api/proposal-comments/{id}](https://risecrm.themesic.com/apiguide/proposal-comments/update-proposal-comment/): Update Proposal Comment - [GET /api/proposal-comments/search/{keyword}](https://risecrm.themesic.com/apiguide/proposal-comments/search-proposal-comments/): Search Proposal Comments ## Team - [GET /api/teams](https://risecrm.themesic.com/apiguide/team/get-teams/): List all Teams - [POST /api/teams](https://risecrm.themesic.com/apiguide/team/create-team/): 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. - [DELETE /api/teams/{id}](https://risecrm.themesic.com/apiguide/team/delete-team/): 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. - [GET /api/teams/{id}](https://risecrm.themesic.com/apiguide/team/show-team/): Get Team by ID - [PUT /api/teams/{id}](https://risecrm.themesic.com/apiguide/team/update-team/): 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. - [GET /api/teams/{id}/members](https://risecrm.themesic.com/apiguide/team/get-team-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. - [GET /api/teams/search/{keyword}](https://risecrm.themesic.com/apiguide/team/search-teams/): Search Teams ## Roles - [GET /api/roles](https://risecrm.themesic.com/apiguide/roles/get-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. - [GET /api/roles/{id}](https://risecrm.themesic.com/apiguide/roles/show-role/): 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. - [GET /api/roles/search/{keyword}](https://risecrm.themesic.com/apiguide/roles/search-roles/): Turns a role name into a role id. Search results never carry the permissions column. ## Project Members - [GET /api/project-members](https://risecrm.themesic.com/apiguide/project-members/list-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. - [POST /api/project-members](https://risecrm.themesic.com/apiguide/project-members/create-project-member/): 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. - [DELETE /api/project-members/{id}](https://risecrm.themesic.com/apiguide/project-members/delete-project-member/): 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. - [GET /api/project-members/{id}](https://risecrm.themesic.com/apiguide/project-members/show-project-member/): Get Project Member by ID - [PUT /api/project-members/{id}](https://risecrm.themesic.com/apiguide/project-members/update-project-member/): 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. - [GET /api/project-members/search/{keyword}](https://risecrm.themesic.com/apiguide/project-members/search-project-members/): Search Project Members ## Templates - [GET /api/templates](https://risecrm.themesic.com/apiguide/templates/get-template-types/): 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. - [GET /api/templates/{type}](https://risecrm.themesic.com/apiguide/templates/get-templates-by-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. - [GET /api/templates/{type}/{id}](https://risecrm.themesic.com/apiguide/templates/show-template/): 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. - [GET /api/templates/{type}/search/{keyword}](https://risecrm.themesic.com/apiguide/templates/search-templates/): 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. ## Custom Fields - [GET /api/custom-fields](https://risecrm.themesic.com/apiguide/custom-fields/get-custom-fields/): List all Custom Field definitions - [GET /api/custom-fields/{id}](https://risecrm.themesic.com/apiguide/custom-fields/show-custom-field/): Get Custom Field definition by ID - [GET /api/custom-fields/values/{relatedTo}/{id}](https://risecrm.themesic.com/apiguide/custom-fields/get-custom-field-values/): 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. - [PUT /api/custom-fields/values/{relatedTo}/{id}](https://risecrm.themesic.com/apiguide/custom-fields/update-custom-field-values/): 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. ## Miscellaneous - [GET /api/client_groups](https://risecrm.themesic.com/apiguide/miscellaneous/get-client-groups/): List Client Groups - [GET /api/contact_by_clientid/{clientid}](https://risecrm.themesic.com/apiguide/miscellaneous/get-contact-by-clientid/): List Contact by ClientID - [GET /api/invoice_labels](https://risecrm.themesic.com/apiguide/miscellaneous/get-invoice-labels/): List Invoice Labels - [GET /api/invoice_tax](https://risecrm.themesic.com/apiguide/miscellaneous/get-invoice-taxes/): List Invoice Taxes - [GET /api/project_labels](https://risecrm.themesic.com/apiguide/miscellaneous/get-project-labels/): List Project Labels - [GET /api/project_members](https://risecrm.themesic.com/apiguide/miscellaneous/get-project-members/): List Project Members - [GET /api/staff_owner](https://risecrm.themesic.com/apiguide/miscellaneous/get-staff-owner/): List Staff Owner - [GET /api/ticket_labels](https://risecrm.themesic.com/apiguide/miscellaneous/get-ticket-labels/): List Ticket Labels - [GET /api/ticket_type](https://risecrm.themesic.com/apiguide/miscellaneous/get-ticket-type/): List Ticket Types ## Optional - [Full endpoint index](https://risecrm.themesic.com/apiguide/): every endpoint on one page - [search-index.json](https://risecrm.themesic.com/apiguide/search-index.json): compact machine-readable index of every endpoint (title, method, path, group, url) - Every endpoint page has a markdown twin at the same path with a .md suffix, e.g. https://risecrm.themesic.com/apiguide/clients/get-clients.md