<?xml version='1.0' encoding='utf-8'?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>OnRamp API changelog</title><link>https://developers.onramp.ai/docs/changelog</link><description>Changes to the OnRamp API that a client can notice.</description><language>en</language><atom:link href="https://developers.onramp.ai/docs/changelog/rss.xml" rel="self" type="application/rss+xml" /><lastBuildDate>Fri, 23 Oct 2026 00:00:00 +0000</lastBuildDate><item><title>Added: Upload files to a form's file request</title><link>https://developers.onramp.ai/docs/changelog#2026-10-23-upload-files-to-a-file-request</link><guid isPermaLink="true">https://developers.onramp.ai/docs/changelog#2026-10-23-upload-files-to-a-file-request</guid><pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate><category>Added</category><description>&lt;p&gt;&lt;code&gt;POST /v1/subtasks/{subtask_id}/files&lt;/code&gt; saves one or more files as the answer to a form's file request. Send the files
as &lt;code&gt;multipart/form-data&lt;/code&gt; in the &lt;code&gt;files&lt;/code&gt; field. Name the file request in &lt;code&gt;element&lt;/code&gt; when the form has more than one.&lt;/p&gt;
&lt;p&gt;When the file request asks for a review, each uploaded file comes back with its review findings. The upload does not
submit the form.&lt;/p&gt;</description></item><item><title>Fixed: Responses carry their authentication, rate-limit and request-ID headers</title><link>https://developers.onramp.ai/docs/changelog#2026-10-23-responses-keep-their-headers</link><guid isPermaLink="true">https://developers.onramp.ai/docs/changelog#2026-10-23-responses-keep-their-headers</guid><pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate><category>Fixed</category><description>&lt;p&gt;JSON responses lost the headers the API set on them. They now carry them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;401&lt;/code&gt; carries &lt;code&gt;WWW-Authenticate: Bearer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Rate-limited endpoints carry the &lt;code&gt;X-RateLimit-*&lt;/code&gt; headers and &lt;code&gt;Retry-After&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Every response carries &lt;code&gt;X-OR-REQUEST-ID&lt;/code&gt; and &lt;code&gt;X-OR-REQUEST-TIME&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Changed: A missing or invalid API key answers 401</title><link>https://developers.onramp.ai/docs/changelog#2026-10-20-401-for-a-missing-or-invalid-key</link><guid isPermaLink="true">https://developers.onramp.ai/docs/changelog#2026-10-20-401-for-a-missing-or-invalid-key</guid><pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate><category>Changed</category><description>&lt;p&gt;A request with no &lt;code&gt;Authorization&lt;/code&gt; header answered &lt;code&gt;403&lt;/code&gt;, and some endpoints answered an invalid API key with &lt;code&gt;400&lt;/code&gt;.
Both now answer &lt;code&gt;401 Unauthorized&lt;/code&gt;, the same status as an unknown or deactivated key.&lt;/p&gt;
&lt;p&gt;If your client treats &lt;code&gt;403&lt;/code&gt; or &lt;code&gt;400&lt;/code&gt; as an authentication failure, treat &lt;code&gt;401&lt;/code&gt; that way too.&lt;/p&gt;</description></item><item><title>Added: List the subtasks of several tasks in one call</title><link>https://developers.onramp.ai/docs/changelog#2026-10-01-list-subtasks-for-several-tasks</link><guid isPermaLink="true">https://developers.onramp.ai/docs/changelog#2026-10-01-list-subtasks-for-several-tasks</guid><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><category>Added</category><description>&lt;p&gt;&lt;code&gt;GET /v1/subtasks?task_ids=…&lt;/code&gt; returns the subtasks of up to 200 tasks, in display order within each task. Each subtask
carries &lt;code&gt;parent_task_uuid&lt;/code&gt;. One call replaces one &lt;code&gt;GET /v1/tasks/{task_id}/subtasks&lt;/code&gt; call per task when you export or
poll a task list.&lt;/p&gt;</description></item><item><title>Fixed: A permission denial answers 403</title><link>https://developers.onramp.ai/docs/changelog#2026-09-29-permission-denials-answer-403</link><guid isPermaLink="true">https://developers.onramp.ai/docs/changelog#2026-09-29-permission-denials-answer-403</guid><pubDate>Tue, 29 Sep 2026 00:00:00 +0000</pubDate><category>Fixed</category><description>&lt;p&gt;When the API key lacked a permission that an endpoint checks, such as the one &lt;code&gt;PUT /v1/tasks/{task_uuid}/time-allotted&lt;/code&gt;
needs, the API answered &lt;code&gt;502&lt;/code&gt;. It now answers &lt;code&gt;403&lt;/code&gt; with a message that names the missing permission.&lt;/p&gt;</description></item><item><title>Changed: Responses identify objects by uuid only</title><link>https://developers.onramp.ai/docs/changelog#2026-09-28-responses-identify-objects-by-uuid</link><guid isPermaLink="true">https://developers.onramp.ai/docs/changelog#2026-09-28-responses-identify-objects-by-uuid</guid><pubDate>Mon, 28 Sep 2026 00:00:00 +0000</pubDate><category>Changed</category><description>&lt;p&gt;An object that has a &lt;code&gt;uuid&lt;/code&gt; is identified by it, and responses no longer include its integer or encoded &lt;code&gt;id&lt;/code&gt;. Requests
still accept integer and encoded identifiers in paths, query filters and bodies.&lt;/p&gt;
&lt;p&gt;The response schemas in the OpenAPI document list their fields again. Since 2026-09-11 they had shown &lt;code&gt;data&lt;/code&gt; as untyped
on project, task, customer, module, user, webhook and note responses.&lt;/p&gt;</description></item><item><title>Added: Read and write time tracking</title><link>https://developers.onramp.ai/docs/changelog#2026-09-25-time-tracking-endpoints</link><guid isPermaLink="true">https://developers.onramp.ai/docs/changelog#2026-09-25-time-tracking-endpoints</guid><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><category>Added</category><description>&lt;p&gt;New endpoints read and write time entries and allotted time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST /v1/time-entries&lt;/code&gt;, and &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;DELETE /v1/time-entries/{entry_uuid}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /v1/tasks/{task_uuid}/time&lt;/code&gt; and &lt;code&gt;PUT /v1/tasks/{task_uuid}/time-allotted&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /v1/projects/{project_uuid}/time-summary&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /v1/time-tracking/reports/allotted-vs-worked&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An identical create sent again with the same API key within 10 minutes returns the existing entry with &lt;code&gt;200&lt;/code&gt;,
so a retry never logs time twice. The
&lt;a href="https://developers.onramp.ai/docs/guides/time-tracking"&gt;time tracking guide&lt;/a&gt; walks through the rules.&lt;/p&gt;</description></item><item><title>Added: Page the task list by cursor</title><link>https://developers.onramp.ai/docs/changelog#2026-09-09-cursor-paging-for-tasks</link><guid isPermaLink="true">https://developers.onramp.ai/docs/changelog#2026-09-09-cursor-paging-for-tasks</guid><pubDate>Wed, 09 Sep 2026 00:00:00 +0000</pubDate><category>Added</category><description>&lt;p&gt;&lt;code&gt;GET /v1/tasks&lt;/code&gt; accepts a &lt;code&gt;cursor&lt;/code&gt; parameter. Send back the cursor from &lt;code&gt;pagination.nextPage&lt;/code&gt; to fetch the next page.
A cursor page costs the same at any depth, so use it to export a large task list. A cursor cannot be combined with
&lt;code&gt;page&lt;/code&gt; or &lt;code&gt;sort&lt;/code&gt;.&lt;/p&gt;</description></item></channel></rss>
