Reonic Activities API
Timeline of events on a project — automatic activity records and manually logged calls and meetings.
Timeline of events on a project — automatic activity records and manually logged calls and meetings.
openapi: 3.1.0
info:
title: Reonic REST Api v3 Activities API
description: 'The Reonic REST API v3 provides programmatic access to create and manage resources. The API follows REST principles and returns responses in JSON format. Authentication is required via an API key passed in the X-Authorization header.
## Errors
All endpoints return errors with the same JSON shape:
```json
{ "message": "human-readable description" }
```
`400` responses additionally include an `errors` field with per-field validation details.
The HTTP status code identifies the cause:
| Status | Meaning | When |
|--------|---------|------|
| `400` | Bad Request | Path params, query string, or request body failed validation. Inspect `errors` for the field-level breakdown. |
| `401` | Unauthorized | The `X-Authorization` header is missing, malformed, does not match an active API key, or belongs to a different API version. The response never indicates which check failed; check that the key matches the endpoint version. API v3 endpoints require a v3 key with the `rnc_v3_` prefix. |
| `403` | Forbidden | The API key is read-only and the request targeted a write endpoint (`POST`). Issue a key with write access. |
| `404` | Not Found | A resource referenced by a path id does not exist or is not visible to your workspace. |
| `429` | Too Many Requests | The per-client rate limit was exceeded. See **Rate limiting** below. |
| `500` | Internal Server Error | Unexpected failure. Safe to retry once; if it persists, contact support. |
| `503` | Service Unavailable | A backing dependency is temporarily unavailable. Retry with exponential backoff. |
## Rate limiting
Limits are shared across all API keys you hold and reset on a 1-minute window. Two buckets:
| Bucket | Limit | Applies to |
|--------|-------|------------|
| `cached` | 500 / min | `GET` requests served from the response cache |
| `uncached` | 30 / min | Cache misses, `GET` requests sent with `Reonic-Cache-Control: no-cache`, and all `POST` requests |
Every response includes:
- `X-RateLimit-Bucket` — `cached` or `uncached`
- `X-RateLimit-Limit` — the bucket''s ceiling (`500` or `30`)
- `X-RateLimit-Remaining` — calls left in the current window
- `X-RateLimit-Reset` — Unix epoch seconds at which the window resets
- `X-RateLimit-Policy` — `<limit>;w=60`
`429` responses additionally set `Retry-After` (in seconds). Wait at least that long before retrying.
## Caching and Reonic-Cache-Control
`GET` responses are cached for up to 1 hour. Identical requests (same path and query) on the same API key return the cached result. To force a fresh read, send `Reonic-Cache-Control: no-cache`; the response is then refreshed and re-cached. Forced refreshes count against the `uncached` rate-limit bucket.
The standard `Cache-Control` header is not honored. Use `Reonic-Cache-Control` to control caching behavior.
## Authentication
Every request must include your API key in the `X-Authorization` header:
```
X-Authorization: <your-api-key>
```
API keys are issued from the Reonic web app and look like `rnc_v3_…`. Send the full value, including the prefix.
'
version: 3.2.0
contact:
email: kontakt@reonic.de
url: https://reonic.com
name: Reonic GmbH
servers:
- url: '{apiBaseUrl}/rest/v3/'
security:
- X-Authorization: []
tags:
- name: Activities
description: Timeline of events on a project — automatic activity records and manually logged calls and meetings.
paths:
/activities:
get:
summary: List activity feed
description: 'Returns the chronological event feed for an entity (or all entities of the calling client) — every status change, file upload, note, tag edit, manual-activity log, and other system-recorded event. Supports filtering by entity, activity kind, and date range, plus standard `page`/`pageSize` pagination.
**Examples:**
- Feed for one residential project: `GET /activities?parentId=<uuid>&parentType=residentialProject&page=1`
- Status changes across the workspace last week: `GET /activities?type=status&from=2026-04-22T00:00:00Z&to=2026-04-29T00:00:00Z`
- All manual call/meeting log entries: `GET /activities?type=manualActivity`
**Allowed API keys:** Read-only, Read and Write'
tags:
- Activities
parameters:
- schema:
type: string
format: uuid
example: 123e4567-e89b-12d3-a456-426614174000
required: false
name: parentId
in: query
- schema:
type: string
enum:
- residentialProject
- commercialProject
- package
- solarComponent
- contact
- photogrammetryJob
- user
example: residentialProject
required: false
name: parentType
in: query
- schema:
type: string
enum:
- note
- file
- task
- user
- team
- status
- signature
- tag
- checklist
- checklistContainer
- manualActivity
- heatpumpSubsidyDe
- heatpumpSubsidyIt
- gridRegistrationDeCreated
- gridRegistrationDeUpdated
- gridRegistrationItCreated
- gridRegistrationItUpdated
- gridRegistrationBrCreated
- gridRegistrationBrUpdated
- heatloadRoomScan
- dealValue
- closeDate
- calendarEvent
- variant
- timeEntry
- invoice
- buildingAddress
- oilTankRemoval
- baustellenservice
description: Filter to a single kind of activity (e.g. `status`, `tag`, `manualActivity`).
required: false
description: Filter to a single kind of activity (e.g. `status`, `tag`, `manualActivity`).
name: type
in: query
- schema:
type: string
format: date-time
required: false
name: from
in: query
- schema:
type: string
format: date-time
required: false
name: to
in: query
- schema:
type: integer
minimum: 1
default: 1
description: 'Page number, starting from 1. Default: 1.'
required: false
description: 'Page number, starting from 1. Default: 1.'
name: page
in: query
- schema:
type: integer
minimum: 1
maximum: 200
default: 50
description: 'Number of items per page. Default: 50. Max: 200.'
required: false
description: 'Number of items per page. Default: 50. Max: 200.'
name: itemsPerPage
in: query
- schema:
type: string
example: no-cache
required: false
name: Reonic-Cache-Control
in: header
description: Set to 'no-cache' to bypass the 1-hour response cache and force a fresh read. The fresh response is then written back to the cache for subsequent callers. Forced refreshes count against the uncached rate-limit bucket (30/min); only cache hits count against the cached bucket (500/min).
responses:
'200':
description: Paginated activity feed
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Activity'
pagination:
type: object
properties:
page:
type: integer
minimum: 1
description: Current page number
perPage:
type: integer
minimum: 1
description: Number of items per page
total:
type: integer
minimum: 0
description: Total number of items across all pages
totalPages:
type: integer
minimum: 1
next:
type:
- string
- 'null'
description: Path to the next page, or null if there is no next page
prev:
type:
- string
- 'null'
description: Path to the previous page, or null if there is no previous page
required:
- page
- perPage
- total
- totalPages
- next
- prev
required:
- data
- pagination
/activities/manual:
get:
summary: Get manual activities
description: 'Returns user-logged calls and meetings recorded against a single Residential Project or Commercial Project entity, ordered most-recent first. Unlike the activity feed (`GET /activities`), this returns the current editable state of each record — including the latest note text — rather than a history of changes.
**Allowed API keys:** Read-only, Read and Write'
tags:
- Activities
parameters:
- schema:
type: string
format: uuid
example: 123e4567-e89b-12d3-a456-426614174000
required: true
name: parentId
in: query
- schema:
type: string
enum:
- residentialProject
- commercialProject
example: residentialProject
required: true
name: parentType
in: query
- schema:
type: integer
minimum: 1
default: 1
description: 'Page number, starting from 1. Default: 1.'
required: false
description: 'Page number, starting from 1. Default: 1.'
name: page
in: query
- schema:
type: integer
minimum: 1
maximum: 200
default: 50
description: 'Number of items per page. Default: 50. Max: 200.'
required: false
description: 'Number of items per page. Default: 50. Max: 200.'
name: itemsPerPage
in: query
- schema:
type: string
example: no-cache
required: false
name: Reonic-Cache-Control
in: header
description: Set to 'no-cache' to bypass the 1-hour response cache and force a fresh read. The fresh response is then written back to the cache for subsequent callers. Forced refreshes count against the uncached rate-limit bucket (30/min); only cache hits count against the cached bucket (500/min).
responses:
'200':
description: Paginated list of manual activities
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/ManualActivity'
pagination:
type: object
properties:
page:
type: integer
minimum: 1
description: Current page number
perPage:
type: integer
minimum: 1
description: Number of items per page
total:
type: integer
minimum: 0
description: Total number of items across all pages
totalPages:
type: integer
minimum: 1
next:
type:
- string
- 'null'
description: Path to the next page, or null if there is no next page
prev:
type:
- string
- 'null'
description: Path to the previous page, or null if there is no previous page
required:
- page
- perPage
- total
- totalPages
- next
- prev
required:
- data
- pagination
/activities/manual/{activityId}:
get:
summary: Get manual activity
description: 'Returns a single user-logged call or meeting by its id, including the current note text, outcome, and edit metadata.
**Allowed API keys:** Read-only, Read and Write'
tags:
- Activities
parameters:
- schema:
type: string
format: uuid
required: true
name: activityId
in: path
- schema:
type: string
example: no-cache
required: false
name: Reonic-Cache-Control
in: header
description: Set to 'no-cache' to bypass the 1-hour response cache and force a fresh read. The fresh response is then written back to the cache for subsequent callers. Forced refreshes count against the uncached rate-limit bucket (30/min); only cache hits count against the cached bucket (500/min).
responses:
'200':
description: The manual activity
content:
application/json:
schema:
$ref: '#/components/schemas/ManualActivity'
/activities/manual/create:
post:
summary: Create manual activity
description: 'Records a call or meeting against a Residential Project or Commercial Project entity. The valid `outcome` values depend on `type`: see the `manualActivityOutcome` enum.
**Allowed API keys:** Read and Write'
tags:
- Activities
requestBody:
content:
application/json:
schema:
type: object
properties:
type:
type: string
enum:
- call
- meeting
outcome:
type: string
enum:
- rescheduled
- completedObjectivesMet
- completedPartialProgress
- requiresFollowup
- cancelled
- connectedSuccessfulDiscussion
- connectedNeedsFollowup
- noAnswer
- leftVoicemailMessage
- wrongContact
note:
type: string
maxLength: 5000
parentId:
type: string
format: uuid
example: 123e4567-e89b-12d3-a456-426614174000
parentType:
type: string
enum:
- residentialProject
- commercialProject
example: residentialProject
required:
- type
- outcome
- note
- parentId
- parentType
responses:
'201':
description: The created manual activity
content:
application/json:
schema:
$ref: '#/components/schemas/ManualActivity'
/activities/manual/{activityId}/update:
post:
summary: Update manual activity
description: 'Replaces a manual activity''s `type`, `outcome`, and `note`. All three are required — there is no partial update.
**Allowed API keys:** Read and Write'
tags:
- Activities
parameters:
- schema:
type: string
format: uuid
required: true
name: activityId
in: path
requestBody:
content:
application/json:
schema:
type: object
properties:
type:
type: string
enum:
- call
- meeting
outcome:
type: string
enum:
- rescheduled
- completedObjectivesMet
- completedPartialProgress
- requiresFollowup
- cancelled
- connectedSuccessfulDiscussion
- connectedNeedsFollowup
- noAnswer
- leftVoicemailMessage
- wrongContact
note:
type: string
maxLength: 5000
required:
- type
- outcome
- note
additionalProperties: false
responses:
'200':
description: The updated manual activity
content:
application/json:
schema:
type: object
properties:
data:
$ref: '#/components/schemas/ManualActivity'
required:
- data
/activities/manual/{activityId}/delete:
post:
summary: Delete manual activity
description: 'Delete a manual activity by its ID.
**Allowed API keys:** Read and Write'
tags:
- Activities
parameters:
- schema:
type: string
format: uuid
required: true
name: activityId
in: path
responses:
'200':
description: Deletion result
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
id:
type: string
format: uuid
example: 123e4567-e89b-12d3-a456-426614174000
required:
- id
required:
- data
components:
schemas:
ManualActivity:
type: object
properties:
id:
type: string
format: uuid
example: 123e4567-e89b-12d3-a456-426614174000
type:
type: string
enum:
- call
- meeting
outcome:
type: string
enum:
- rescheduled
- completedObjectivesMet
- completedPartialProgress
- requiresFollowup
- cancelled
- connectedSuccessfulDiscussion
- connectedNeedsFollowup
- noAnswer
- leftVoicemailMessage
- wrongContact
note:
type:
- string
- 'null'
parentId:
type: string
format: uuid
example: 123e4567-e89b-12d3-a456-426614174000
parentType:
type: string
enum:
- residentialProject
- commercialProject
example: residentialProject
createdAt:
type:
- string
- 'null'
format: date-time
example: '2026-01-01T15:30:00.000Z'
createdById:
type:
- string
- 'null'
format: uuid
updatedAt:
type:
- string
- 'null'
format: date-time
example: '2026-01-01T15:30:00.000Z'
updatedById:
type:
- string
- 'null'
format: uuid
required:
- id
- type
- outcome
- note
- parentId
- parentType
- createdAt
- createdById
- updatedAt
- updatedById
Activity:
type: object
properties:
id:
type: string
format: uuid
example: 123e4567-e89b-12d3-a456-426614174000
type:
type: string
description: Activity template key (e.g. `tagsUpdated`, `noteCreated`).
associatedType:
type:
- string
- 'null'
enum:
- note
- file
- task
- user
- team
- status
- signature
- tag
- checklist
- checklistContainer
- manualActivity
- heatpumpSubsidyDe
- heatpumpSubsidyIt
- gridRegistrationDeCreated
- gridRegistrationDeUpdated
- gridRegistrationItCreated
- gridRegistrationItUpdated
- gridRegistrationBrCreated
- gridRegistrationBrUpdated
- heatloadRoomScan
- dealValue
- closeDate
- calendarEvent
- variant
- timeEntry
- invoice
- buildingAddress
- oilTankRemoval
- baustellenservice
- null
associatedId:
type:
- string
- 'null'
format: uuid
parentId:
type: string
format: uuid
example: 123e4567-e89b-12d3-a456-426614174000
parentType:
type: string
enum:
- residentialProject
- commercialProject
- package
- solarComponent
- contact
- photogrammetryJob
- user
example: residentialProject
createdAt:
type:
- string
- 'null'
format: date-time
example: '2026-01-01T15:30:00.000Z'
createdById:
type:
- string
- 'null'
format: uuid
required:
- id
- type
- associatedType
- associatedId
- parentId
- parentType
- createdAt
- createdById
securitySchemes:
X-Authorization:
type: apiKey
in: header
name: X-Authorization
x-tagGroups:
- name: People
tags:
- Contacts
- Users
- Teams
- name: Projects
tags:
- Residential Projects
- Commercial Projects
- name: Working on a project
tags:
- Notes
- Tasks
- Files
- File Folders
- Activities
- Time Tracking
- Checklists
- Checklist Templates
- Signature Requests
- name: Calendar
tags:
- Calendars
- Calendar Categories
- Appointments
- name: Catalog
tags:
- Components
- Planning Templates
- Planning Packages
- Offer Templates
- name: Workspace setup
tags:
- Kanban Boards
- Kanban Columns
- Tags
- Lead Sources
- name: Wiki
tags:
- Wiki
- name: Services
tags:
- Photogrammetry
- name: API helpers
tags:
- Upload
- Links
- name: Integrations
tags:
- Webhooks
- name: Guides
tags:
- Migrating from API v2 to v3
- Changelog