openapi: 3.1.0 info: title: 'Hubhus API' description: "
\nDownload OpenAPI Specification\nDownload Postman Collection\n
\n\n> ℹ️ **For AI tools:** Copy and paste this prompt to get started:\n>\n> ```text\n> Read the OpenAPI spec at https://leadvalidator.dk/docs/openapi.yaml and\n> use it as the source of truth. Summarise what the API does, how auth\n> works, and which endpoints I need for: [describe your use case]. Then\n> write the integration in [your language/framework]. Only use endpoints\n> and fields that exist in the spec, and tell me if something I want isn't\n> supported. If you can't fetch the URL, say so rather than guessing.\n> ```\n\nℹ️ Note: This API is intended to be used server-side only. Direct calls from a browser will result in a CORS (Cross-Origin Resource Sharing) error. Please ensure all requests are made from a server environment.\n\n# Authentication\n\nAll endpoints require authentication using a Bearer token in the http headers:\n```\nAuthorization: Bearer {YOUR_API_TOKEN}\n```\nTo create or manage API tokens, go to your account's [API documentation](/api-documentation?tab=tokens) page.\nOn this page you can also view all the available slug names in each of your campaigns.\n\n💡API keys can be configured to not grant access to some endpoints and entities.\n\n# Filtering results\nMost endpoints that return collections of resources allow you to use `filter` parameters to narrow down the results.\n\nThis is a general introduction to Hubhus filter syntax. Each endpoint lists the filters it supports, as well as additional information and examples.\n\nSyntax: `?filter[{property}]={value}`.\n\nIf you supply multiple values separated with commas, the filter joins them with `OR`. For example, `?filter[id]=1,2,3` returns 3 entities.\n\n⚠️ Do not add extra whitespace between comma separated values\n\n**Examples**\n\n`/calendar-events?filter[created_after]=2023-01-01&filter[leads.campaign_id]=2`\n\n## Has-relation filters\n\nHas-relation filters lets you filter resources based on their relation count.\n\nSyntax: `?filter[has:{relation}]={boolean|integer}`.\n\nUse a boolean (`true/false`) to check if the relation exists or an integer value to specify a minimum relation count.\n\n**Examples**\n\n`/leads?filter[has:calendar_events]=true`\n\n\n`/leads?filter[has:calendar_events]=false`\n\n\n`/leads?filter[has:calendar_events]=2`\n\n## Expression filters\n\nExpression filters lets you filter resources using comparison and logical operators. Not all endpoints expose expression filters.\n\nSyntax: `?filter[{resource}]={property} {operator} {value}`\n\nℹ️ Whitespace between property, operator and value is optional.\n\n`{resource}` is the resource or target relation the filter is applied to. To refer to the endpoint resource, use `self`.\n\n`{property}` is the property to filter by.\n\n`{operator}` is one of the operators from operators table below.\n\n`{value}` is the comparison value.\n\n| Operator | Description | Note | Example |\n|---------------|---------------------------|------------------------|---------------------------------------------------------------------|\n| `=` | Equals (case-insensitive) | | |\n| `!=` | Not equals | | |\n| `<` | Is less than | | |\n| `>` | Is greater than | | |\n| `<=` | Is less than or equal to | | |\n| `>=` | Is greater than or equal to | | |\n| `IN` | Is in value list | Value separator is `;` | `{property} IN value1;value2;value3` |\n| `NOT-IN` | Is not in value list | Value separator is `;` | `{property} NOT-IN value1;value2;value3` |\n| `LIKE` | Matches substring | Wildcard is `%` or `*` | `{property} LIKE *contains*` or `{property} LIKE startsWith*` |\n| `NOT-LIKE` | Does not match substring | Wildcard is `%` or `*` | `{property} NOT-LIKE *contains*` or `{property} NOT-LIKE *endsWith` |\n\n⚠️ Wildcards are only allowed when filtering string values\n\n⚠️ The operators `IN`, `NOT-IN`, `LIKE`, and `NOT-LIKE` must be in all capital letters.\n\n⚠️ Using `LIKE`, and `NOT-LIKE` may lead to poor performance. Always use exact comparison when possible.\n\nℹ️ Separate multiple expressions with commas. The filter joins them with `AND` and returns only resources matching *all* the expressions.\n\nℹ️ Refer to individual endpoints for information about which properties can be used in expression filters.\n\n**Examples**\n\n`/leads?filter[status]=slug = won, set_at > today`
\n\n\n`/leads?filter[calendar_events]=calendar_service_id IN 12;13, created_at >= now -24 hours`
\n\n\n`/leads?filter[field_value]=datefield > 2023-01-01 12:00, emailfield=email@example.com, boolfield!=1`
\n\n\n`/leads?filter[field_value]=name LIKE John*, zipcode IN 2000;3000`\n\nThe available expression filter properties are described in the documentation for each endpoint.\n\n### Deleted records\n\nBy default, no deleted records are returned.\n\nHowever, some endpoints allow expression filters on a `deleted_at` column. If you use this filter, *only* deleted records matching your expression will be returned.\n\n\n# Including relationships\n\nThe `include` parameter lets you include data from related resources.\n\nBy default, the filter includes no data from related resources.\n\nSeparate multiple relationships with commas.\n\n**Examples**\n\n`/leads?include=field_values,select_field_values,status,assignee`\n\n`/calendar-events?include=calendar_resources,calendar_services,leads`\n\nℹ️ Refer to individual endpoints for information about which relationships can be included.\n\n# Sorting results\n\nThe `sort` parameter lets you sort the search result.\n\nBy default, the filter sorts the search result in ascending order. To sort in descending order, prefix the property with a hyphen (`-`).\n\nTo sort after multiple properties, list them in order of precedence, separated by commas.\n\n**Examples**\n\n`/leads?sort=-updated_at`\n\n`/leads?sort=created_at,-id`\n\n⚠️ Some sort options can make the request slower to process. Please reach out to support if your use case performs poorly.\n\nThe available sort options are described in the documentation for each endpoint.\n\n# Pagination\n\nAll collection endpoints use pagination, returning a subset of the results with each response, along with metadata.\n\nYou can use the `per_page` and `page` query parameters to control pagination.\n\nSyntax to get a specific number of resources per page: `?per_page=50`. The default `per_page` value is 25. The maximum is 500.\n\nSyntax to get a specific page: `?page=2`.\n\nYou have reached the last page when `links.next` is null.\n\nTo get the total number of matching resources, request `?per_page=1` and read the total count from `meta.total`.\n\n**Paginated response structure example**\n\n```json\n{\n \"data\": [\n {\n \"id\": 1,\n ...\n },\n ...\n {\n \"id\": 15,\n ...\n }\n ],\n \"links\": {\n \"first\": \"https://api.leadvalidator.dk/resources?page=1\",\n \"last\": \"https://api.leadvalidator.dk/resources?page=14\",\n \"prev\": null,\n \"next\": \"https://api.leadvalidator.dk/resources?page=2\"\n },\n \"meta\": {\n \"current_page\": 1,\n \"from\": 1,\n \"last_page\": 14,\n \"path\": \"https://api.leadvalidator.dk/resources\",\n \"per_page\": 15,\n \"to\": 15,\n \"total\": 197\n }\n}\n```\n\n# Rate limit\nAll responses include rate limiting headers indicating the limit, and number of remaining requests in the current interval.\n```\nX-RateLimit-Limit: 500\nX-RateLimit-Remaining: 499\n```\nIf you exceed the limit, you will receive a `429 Too Many Requests` response. These responses include an extra header with a timestamp indicating when the limit will reset.\n```\nX-RateLimit-Reset: 1766602800\n```\n\n# Datetime formats\n\nThe API returns datetimes in ISO 8601 format, for example, `2023-01-18T09:28:32.000000Z`.\n\nDatetime filters lets you limit the search result to resources that have a timestamp before, at, or after a certain datetime.\n\nThe filter is flexible about how you specify datetime formats, but we recommend [the ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601).\n\nIncluding a timezone is optional. By default, the filter uses Europe/Copenhagen.\n\nThe API evaluates relative datetimes according to [the PHP function `strtotime`](https://www.php.net/manual/en/function.strtotime.php).\n\n**Examples**\n\n`/leads?filter[created_after]=2023-01-22T14:46:23+01:00`\n\n\n`/leads?filter[created_after]=2023-01-22T13:46:23Z`\n\n\n`/leads?filter[created_after]=2023-01-22 14:46:23`\n\n\n`/leads?filter[created_after]=now -1 hour`\n\n\n`/calendar-events?filter[property]=start >= today 12:00, start < tomorrow 00:00`\n" version: 1.0.0 contact: name: 'Hubhus Support' url: 'https://hubhus.freshdesk.com' email: support@hubhus.com license: name: Proprietary url: 'https://hubhus.com/policies' servers: - url: 'https://api.leadvalidator.dk' tags: - name: Absences description: 'Registered absences. Approving, rejecting, changing and deleting an absence is done in Hubhus.' - name: 'Booking Forms' description: 'A booking form is a form that allows users to book appointments or services into a resource calendar. A booking form model defines both the algorithm settings and the user interface. A booking form can be used both to create event and lead in one step, or to create an event and add an existing lead to the event.' - name: 'Calendar Events' description: 'A calendar event represents a scheduled appointment or meeting on the calendar, linked to calendar resources, and optional leads and calendar services.' - name: 'Calendar Resource Groups' description: 'Calendar resource group. Also referred to as calendar resource tag.' - name: 'Calendar Resource Teams' description: 'Calendar resource team. A calendar resource can be assigned to one team only. A team can have multiple calendar resources.' - name: 'Calendar Resources' description: "A calendar resource is a either a user's calendar or calendar without a linked user (like a meeting room). A calendar event must be linked to one or more calendar resources." - name: 'Calendar Services' description: 'A calendar service defines a type of calendar event (e.g. sales meeting, installment). Also known as calendar event type.' - name: Campaigns description: 'A campaign is a flexible data container, similar to a table, with customizable fields (columns) and entries (rows). Each entry is called a lead and can represent any type of record.' - name: Consents description: 'Represents the consent state for a single consent declaration.' - name: Contacts description: 'A contact has a name and a unique email address. A contact can have multiple leads in different campaigns.' - name: GPS description: 'GPS Vehicles, stops and trips' - name: Leads description: 'A lead is a single data entry (row) in a campaign. A lead can represent any type of record.' - name: 'Microsoft Events' description: 'Requires the Microsoft Calendars integration' - name: 'Products (beta)' description: 'Products apis a work in progress, and subject to change without notice.' - name: 'Time tracking (beta)' description: 'Time tracking apis a work in progress, and subject to change without notice.' - name: Users description: 'A user of the system.' components: securitySchemes: default: type: http scheme: bearer description: 'See the Authentication section for details' schemas: Absence: type: object title: Absence additionalProperties: false description: 'An absence period registered by a user.' properties: id: type: integer description: 'Unique absence identifier.' examples: - 1 user_id: type: integer description: "The absent user's id." examples: - 1 user: $ref: '#/components/schemas/User' type: object description: 'The user the absence refers to. _Present only when user is included._' x-condition: 'Present only when user is included.' type: type: string description: 'Absence type slug' enum: - vacation - paid_leave - unpaid_leave - other examples: - vacation type_label: type: string description: 'Absence type label' enum: - Vacation - 'Paid leave' - 'Unpaid leave' - Other examples: - Vacation start: type: string description: 'Absence start date.' format: date examples: - '2026-12-23' end: type: string description: 'Absence end date.' format: date examples: - '2027-01-02' working_days: type: integer description: 'Duration calculated in working days, based on the active holiday calendar. _Present when include_working_days is true._' x-condition: 'Present when include_working_days is true.' examples: - 5 user_note: type: - string - 'null' description: 'Note by the absent user.' examples: - 'Merry christmas!' status: type: string description: 'Absence status slug' enum: - pending - approved - denied examples: - pending status_label: type: string description: 'Absence status label' enum: - Pending - Approved - Denied examples: - Pending decided_at: type: - string - 'null' description: 'When the absence was approved or rejected.' format: date-time examples: - null decided_by_user_id: type: - integer - 'null' description: 'Id of the deciding user.' examples: - null urls: type: object title: Urls additionalProperties: false properties: api_resource: type: string examples: - 'https://api.leadvalidator.dk/absences/1' required: - api_resource description: 'URLs for this absence. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' created_at: type: string description: 'When the absence was created.' format: date-time examples: - '2026-09-15T09:30:00.000000Z' updated_at: type: string description: 'When the absence was last updated.' format: date-time examples: - '2026-09-15T09:30:00.000000Z' required: - id - user_id - type - type_label - start - end - user_note - status - status_label - decided_at - decided_by_user_id - created_at - updated_at Assignee: type: object title: Assignee additionalProperties: false description: 'A person or user assigned to a campaign lead.' properties: id: type: integer description: 'Unique person identifier.' examples: - 1 user_id: type: - integer - 'null' description: 'Unique user identifier, if the person is a registered user.' examples: - 1 name: type: - string - 'null' description: 'Name of the person, if not a registered user. _Present when the person is not a registered user._' x-condition: 'Present when the person is not a registered user.' examples: - string email: type: - string - 'null' description: 'Email of the person, if not a registered user. _Present when the person is not a registered user._' x-condition: 'Present when the person is not a registered user.' examples: - string user: oneOf: - $ref: '#/components/schemas/User' type: object description: 'User details, present if user_id is set and user is included. _Present only when user is included._' x-condition: 'Present only when user is included.' - type: 'null' created_at: type: string description: 'When the person record was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the person record was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - user_id - created_at - updated_at BookingForm: type: object title: BookingForm additionalProperties: false description: 'A booking form is a form that allows users to book appointments or services into a resource calendar. A booking form model defines both the algorithm settings and the user interface. A booking form can be used both to create event and lead in one step, or to create an event and add an existing lead to the event.' properties: id: type: integer description: 'Unique booking form identifier.' examples: - 1 campaign_id: type: integer description: 'Campaign identifier.' examples: - 101 name: type: string description: 'Booking form name.' examples: - 'Consultation Booking' slug: type: string description: 'Booking form slug.' examples: - consultation-booking token: type: string description: 'Booking form token.' examples: - abc123token calendar_resources: type: array items: $ref: '#/components/schemas/CalendarResource' type: object description: '' description: 'Calendar resources linked to this booking form. _Present only when calendar_resources is included._' x-condition: 'Present only when calendar_resources is included.' campaign: $ref: '#/components/schemas/Campaign' type: object description: 'Campaign linked to this booking form. _Present only when campaign is included._' x-condition: 'Present only when campaign is included.' urls: type: object title: Urls additionalProperties: false properties: api_resource: type: string examples: - 'https://api.leadvalidator.dk/booking-forms/1' form: type: string examples: - 'https://api.leadvalidator.dk' optimal-datetime-slots: type: string examples: - 'https://api.leadvalidator.dk' available-dates: type: string examples: - 'https://api.leadvalidator.dk' available-time-slots: type: string examples: - 'https://api.leadvalidator.dk' required: - api_resource - form - optimal-datetime-slots - available-dates - available-time-slots description: 'URLs for this bookingform. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' order_weight: type: integer description: 'Order weight of the booking form.' examples: - 1 created_at: type: string description: 'When the booking form was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the booking form was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - campaign_id - name - slug - token - order_weight - created_at - updated_at BookingSubmission: type: object title: BookingSubmission additionalProperties: false description: 'Represents a successful booking form submission.' properties: lead_id: type: - integer - 'null' description: 'Lead identifier.' examples: - 1 booking_form_id: type: - integer - 'null' description: 'Booking form identifier.' examples: - 1 lead: oneOf: - $ref: '#/components/schemas/Lead' type: object description: 'The lead associated with this booking submission. _Present only when lead is included._' x-condition: 'Present only when lead is included.' - type: 'null' booking_form: oneOf: - $ref: '#/components/schemas/BookingForm' type: object description: 'The booking form used for this submission. _Present only when booking_form is included._' x-condition: 'Present only when booking_form is included.' - type: 'null' suggested_slot: type: boolean description: 'Whether this is a suggested time slot booking.' examples: - false ip: type: - string - 'null' description: 'IP address the form was submitted from.' examples: - 127.0.0.1 form_page_url: type: - string - 'null' description: 'URL of the booking form page.' examples: - 'https://example.com/booking' created_lead: type: boolean description: 'Whether a new lead was created from this booking.' examples: - true created_at: type: string description: 'When the booking was submitted.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the booking was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - lead_id - booking_form_id - suggested_slot - ip - form_page_url - created_lead - created_at - updated_at CalendarBusinessHour: type: object title: CalendarBusinessHour additionalProperties: false description: 'Calendar business hour.' properties: days_of_week: type: string description: 'Days of the week (comma-separated).' examples: - '1,2,3' start_time: type: string description: 'Start time.' examples: - '09:00' end_time: type: string description: 'End time.' examples: - '17:00' weeks: type: string description: 'Weeks label.' examples: - 'Even weeks' created_at: type: string description: 'When the business hour was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the business hour was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - days_of_week - start_time - end_time - weeks - created_at - updated_at CalendarEvent: type: object title: CalendarEvent additionalProperties: false description: 'A calendar event represents a scheduled appointment or meeting on the calendar, linked to calendar resources, and optional leads and calendar services.' properties: id: type: integer description: 'Unique calendar event identifier.' examples: - 1 title: type: string description: 'Event title.' examples: - Consultation location: type: string description: 'Event location.' examples: - 'Office A' description: type: string description: 'Event description.' examples: - 'Discussion about the project' start: type: string description: 'Event start date and time.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' end: type: string description: 'Event end date and time.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' all_day: type: boolean description: 'Whether the event spans the whole day.' examples: - false private: type: boolean description: 'Whether this is a private event.' examples: - false color: type: - string - 'null' description: 'Event color hex code.' examples: - '#FF5733' type: type: string description: 'Event type slug.' examples: - meeting allow_overlap: type: boolean description: 'Whether the event allows booking overlap.' examples: - true content_visibility: type: - string - 'null' description: 'Content visibility label.' examples: - All calendar_services: type: array items: $ref: '#/components/schemas/CalendarEventService' type: object description: '' description: 'Calendar services for this event, wrapped in a data envelope. _Present only when calendar_services is included._' x-condition: 'Present only when calendar_services is included.' calendar_resources: type: array items: $ref: '#/components/schemas/CalendarResource' type: object description: '' description: 'Calendar resources for this event, wrapped in a data envelope. _Present only when calendar_resources is included._' x-condition: 'Present only when calendar_resources is included.' leads: type: array items: $ref: '#/components/schemas/Lead' type: object description: '' description: 'Leads linked to this event, wrapped in a data envelope. _Present only when leads is included._' x-condition: 'Present only when leads is included.' booking: oneOf: - $ref: '#/components/schemas/BookingSubmission' type: object description: 'Booking submission for this event, wrapped in a data envelope. _Present only when booking is included._' x-condition: 'Present only when booking is included.' - type: 'null' created_by_actor: type: object title: CreatedByActor additionalProperties: false properties: type: type: string description: 'Actor type name.' examples: - User actor: oneOf: - $ref: '#/components/schemas/User' type: object description: 'The user actor. Null if not a user actor. _Present only when actor is included._' x-condition: 'Present only when actor is included.' - type: 'null' required: - type description: 'Information about who created the event. _Present when the createdByUser relation is loaded._' x-condition: 'Present when the createdByUser relation is loaded.' urls: type: object title: Urls additionalProperties: false properties: online_meeting: type: string examples: - 'https://api.leadvalidator.dk' mobile_page: type: string examples: - 'https://api.leadvalidator.dk' calendar_page: type: string examples: - 'https://api.leadvalidator.dk' api_resource: type: string examples: - 'https://api.leadvalidator.dk/calendar-events/1' required: - online_meeting - mobile_page - calendar_page - api_resource description: 'URLs for this calendarevent. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' created_at: type: string description: 'When the event was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the event was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' deleted_at: type: - string - 'null' description: 'When the event was soft-deleted. _Present only when the event is deleted._' x-condition: 'Present only when the event is deleted.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - title - location - description - start - end - all_day - private - color - type - allow_overlap - content_visibility - created_at - updated_at CalendarEventService: type: object title: CalendarEventService additionalProperties: false description: 'Represents a calendar service linked to a calendar event.' properties: id: type: - integer - 'null' description: 'Calendar service identifier.' examples: - 1 name: type: - string - 'null' description: 'Service name.' examples: - Consultation slug: type: - string - 'null' description: 'Service slug.' examples: - consultation service_field_values: type: object title: ServiceFieldValues additionalProperties: type: - string - 'null' properties: {} description: 'Dynamic map of service field slug to value.' required: - id - name - slug - service_field_values CalendarResource: type: object title: CalendarResource additionalProperties: false description: "A calendar resource is a either a user's calendar or calendar without a linked user (like a meeting room). A calendar event must be linked to one or more calendar resources." properties: id: type: integer description: 'Unique calendar resource identifier.' examples: - 1 type: type: string description: 'Resource type.' examples: - user user_id: type: - integer - 'null' description: 'Unique user identifier if linked to a user.' examples: - 1 user: oneOf: - $ref: '#/components/schemas/User' type: object description: 'User linked to this calendar resource. _Present only when user is included._' x-condition: 'Present only when user is included.' - type: 'null' name: type: string description: 'Resource name. _Present when this is not a user resource._' x-condition: 'Present when this is not a user resource.' examples: - 'Truck 1' active: type: boolean description: 'Whether the resource is active.' examples: - true background_color: type: - string - 'null' description: 'Background color of the resource.' examples: - '#FF5733' duration_factor: type: - string - 'null' description: 'Duration factor of the resource.' examples: - '1.0' order_weight: type: integer description: 'Order weight of the calendar resource.' examples: - 1 base_location: type: object title: BaseLocation additionalProperties: false properties: base_address: type: string examples: - string base_address_after: type: string examples: - string operable_postal_codes: type: array items: type: string required: - base_address - base_address_after - operable_postal_codes description: 'Base location details. _Present when `base_location` is included._' x-condition: 'Present when `base_location` is included.' resource_team: $ref: '#/components/schemas/CalendarResourceTeam' type: object description: 'Team associated with this resource. _Present only when resource_team is included._' x-condition: 'Present only when resource_team is included.' resource_groups: type: array items: $ref: '#/components/schemas/CalendarResourceGroup' type: object description: '' description: 'Groups associated with this resource. _Present only when resource_groups is included._' x-condition: 'Present only when resource_groups is included.' special_dates: type: array items: $ref: '#/components/schemas/CalendarResourceDate' type: object description: '' description: 'Special dates associated with this resource. _Present only when special_dates is included._' x-condition: 'Present only when special_dates is included.' business_hours: type: array items: $ref: '#/components/schemas/CalendarBusinessHour' type: object description: '' description: 'Business hours associated with this resource. _Present only when business_hours is included._' x-condition: 'Present only when business_hours is included.' urls: type: object title: Urls additionalProperties: false properties: mobile_calendar_page: type: string examples: - 'https://api.leadvalidator.dk' api_resource: type: string examples: - 'https://api.leadvalidator.dk/calendar-resources/1' is-busy: type: string examples: - 'https://api.leadvalidator.dk' required: - mobile_calendar_page - api_resource - is-busy description: 'URLs for this calendarresource. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' created_at: type: string description: 'When the calendar resource was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the calendar resource was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - type - user_id - active - background_color - duration_factor - order_weight - created_at - updated_at CalendarResourceDate: type: object title: CalendarResourceDate additionalProperties: false description: 'Calendar resource special date.' properties: date_from: type: string description: 'Start date.' format: date examples: - '2026-09-04' date_to: type: string description: 'End date.' format: date examples: - '2026-09-05' base_location: type: - string - 'null' description: 'Base location.' examples: - 'Office A' operable_postal_codes: type: - array - 'null' items: type: string created_at: type: string description: 'When the date was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the date was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - date_from - date_to - base_location - operable_postal_codes - created_at - updated_at CalendarResourceGroup: type: object title: CalendarResourceGroup additionalProperties: false description: 'Calendar resource group. Also referred to as calendar resource tag.' properties: id: type: integer description: 'Unique group identifier.' examples: - 1 name: type: string description: 'Group name.' examples: - 'Service Group' order_weight: type: integer description: 'Order weight of the group.' examples: - 1 calendar_resources: type: array items: $ref: '#/components/schemas/CalendarResource' type: object description: '' description: 'Resources linked to this group. _Present only when calendar_resources is included._' x-condition: 'Present only when calendar_resources is included.' urls: type: object title: Urls additionalProperties: false properties: api_resource: type: string examples: - 'https://api.leadvalidator.dk/calendar-resource-groups/1' required: - api_resource description: 'URLs for this calendarresourcegroup. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' created_at: type: string description: 'When the group was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the group was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - order_weight - created_at - updated_at CalendarResourceTeam: type: object title: CalendarResourceTeam additionalProperties: false description: 'Calendar resource team. A calendar resource can be assigned to one team only. A team can have multiple calendar resources.' properties: id: type: integer description: 'Unique team identifier.' examples: - 1 name: type: string description: 'Team name.' examples: - 'Sales Team' order_weight: type: integer description: 'Order weight of the team.' examples: - 1 calendar_resources: type: array items: $ref: '#/components/schemas/CalendarResource' type: object description: '' description: 'Resources in this team. _Present only when calendar_resources is included._' x-condition: 'Present only when calendar_resources is included.' urls: type: object title: Urls additionalProperties: false properties: api_resource: type: string examples: - 'https://api.leadvalidator.dk/calendar-resource-teams/1' required: - api_resource description: 'URLs for this calendarresourceteam. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' created_at: type: string description: 'When the team was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the team was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - order_weight - created_at - updated_at CalendarService: type: object title: CalendarService additionalProperties: false description: 'A calendar service defines a type of calendar event (e.g. sales meeting, installment). Also known as calendar event type.' properties: id: type: integer description: 'Unique calendar service identifier.' examples: - 1 name: type: string description: 'Display name.' examples: - Consultation slug: type: string description: 'URL-safe slug identifier.' examples: - consultation color: type: - string - 'null' description: 'Color hex value for this service.' examples: - '#FF5733' icon_clz: type: - string - 'null' description: 'CSS icon class.' examples: - fa-calendar default_duration: type: integer description: 'Default event duration in minutes.' examples: - 60 all_day: type: boolean description: 'Whether events of this type are all-day events.' examples: - false order_weight: type: integer description: 'Sort position.' examples: - 10 fields: type: array items: $ref: '#/components/schemas/CalendarServiceField' type: object description: '' description: 'Custom fields for this service. _Present only when fields is included._' x-condition: 'Present only when fields is included.' campaigns: type: array items: $ref: '#/components/schemas/Campaign' type: object description: '' description: 'Campaigns linked to this service. _Present only when campaigns is included._' x-condition: 'Present only when campaigns is included.' urls: type: object title: Urls additionalProperties: false properties: api_resource: type: string examples: - 'https://api.leadvalidator.dk/calendar-services/1' required: - api_resource description: 'URLs for this calendarservice. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' created_at: type: string description: 'When the calendar service was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the calendar service was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - slug - color - icon_clz - default_duration - all_day - order_weight - created_at - updated_at CalendarServiceField: type: object title: CalendarServiceField additionalProperties: false description: 'A custom field attached to a calendar service (event type).' properties: id: type: integer description: 'Unique calendar service field identifier.' examples: - 1 name: type: string description: 'Display name.' examples: - 'Bags used' slug: type: string description: 'Slug identifier.' examples: - bags-used icon_clz: type: - string - 'null' description: 'CSS icon class.' examples: - fa-home is_pii: type: boolean description: 'Whether the field contains personally identifiable information.' examples: - false order_weight: type: integer description: 'Sort position.' examples: - 1 is_required: type: boolean description: 'Whether the field is required when creating an event.' examples: - false is_multi_select: type: boolean description: 'Whether multiple options can be selected.' examples: - false options: type: array items: type: string description: 'Available options for the field.' default_value: type: - string - 'null' description: 'Default field value.' examples: - 000-000-0000 required: - id - name - slug - icon_clz - is_pii - order_weight - is_required - is_multi_select - options - default_value Campaign: type: object title: Campaign additionalProperties: false description: 'A campaign is a flexible data container, similar to a table, with customizable fields (columns) and entries (rows). Each entry is called a lead and can represent any type of record.' properties: id: type: integer description: 'Unique campaign identifier.' examples: - 101 name: type: string description: 'Display name.' examples: - Leads campaign_group_id: type: integer description: 'Unique parent campaign group identifier.' examples: - 1 campaign_group: $ref: '#/components/schemas/CampaignGroup' type: object description: 'Parent campaign group. _Present only when campaign_group is included._' x-condition: 'Present only when campaign_group is included.' fields: type: array items: $ref: '#/components/schemas/Field' type: object description: '' description: 'Standard attribute fields. _Present only when fields is included._' x-condition: 'Present only when fields is included.' select_fields: type: array items: $ref: '#/components/schemas/SelectField' type: object description: '' description: 'Select fields. _Present only when select_fields is included._' x-condition: 'Present only when select_fields is included.' enrichment_fields: type: array items: $ref: '#/components/schemas/EnrichmentField' type: object description: '' description: 'Enrichment fields. _Present only when enrichment_fields is included._' x-condition: 'Present only when enrichment_fields is included.' file_fields: type: array items: $ref: '#/components/schemas/FileField' type: object description: '' description: 'File fields. _Present only when file_fields is included._' x-condition: 'Present only when file_fields is included.' data_fields: type: array items: $ref: '#/components/schemas/DataField' type: object description: '' description: 'Data fields. _Present only when data_fields is included._' x-condition: 'Present only when data_fields is included.' statuses: type: array items: $ref: '#/components/schemas/Status' type: object description: '' description: 'Statuses. _Present only when statuses is included._' x-condition: 'Present only when statuses is included.' assignees: type: array items: $ref: '#/components/schemas/Assignee' type: object description: '' description: 'Assignees. _Present only when assignees is included._' x-condition: 'Present only when assignees is included.' nps_surveys: type: array items: $ref: '#/components/schemas/NpsSurvey' type: object description: '' description: 'NPS surveys. _Present only when nps_surveys is included._' x-condition: 'Present only when nps_surveys is included.' booking_forms: type: array items: $ref: '#/components/schemas/BookingForm' type: object description: '' description: 'Booking forms. _Present only when booking_forms is included._' x-condition: 'Present only when booking_forms is included.' parent_campaigns: type: array items: $ref: '#/components/schemas/Campaign' type: object description: '' description: 'Parent campaigns. _Present only when parent_campaigns is included._' x-condition: 'Present only when parent_campaigns is included.' child_campaigns: type: array items: $ref: '#/components/schemas/Campaign' type: object description: '' description: 'Child campaigns. _Present only when child_campaigns is included._' x-condition: 'Present only when child_campaigns is included.' consent_declarations: type: array items: $ref: '#/components/schemas/ConsentDeclaration' type: object description: '' description: 'Consent declarations. _Present only when consent_declarations is included._' x-condition: 'Present only when consent_declarations is included.' order_weight: type: integer description: 'Sort position within the campaign group.' examples: - 1 created_at: type: string description: 'When the campaign was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the campaign was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' entity_name: type: object title: EntityName additionalProperties: false properties: singular: type: string examples: - Lead plural: type: string examples: - Leads required: - singular - plural description: 'Entity name. _Present only when `entity_name` is included._' x-condition: 'Present only when `entity_name` is included.' urls: type: object title: Urls additionalProperties: false properties: table_page: type: string examples: - 'https://api.leadvalidator.dk' api_resource: type: string examples: - 'https://api.leadvalidator.dk/campaigns/1' required: - table_page - api_resource description: 'URLs for this campaign. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' consent_setting: type: object title: ConsentSetting additionalProperties: false properties: placeholders: type: object title: Placeholders additionalProperties: true properties: {} mandatory: type: boolean examples: - false created_at: type: string format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - placeholders - mandatory - created_at - updated_at description: 'Consent setting for this campaign. _Present only when the Campaign is included as a relation to ConsentDeclaration_' x-condition: 'Present only when the Campaign is included as a relation to ConsentDeclaration' required: - id - name - campaign_group_id - order_weight - created_at - updated_at CampaignGroup: type: object title: CampaignGroup additionalProperties: false description: 'A campaign group is a collection of campaigns. A campaign must belong to exactly one campaign group.' properties: id: type: integer description: 'Unique campaign group identifier.' examples: - 1 name: type: string description: 'Display name.' examples: - Sales order_weight: type: integer description: 'Order weight.' examples: - 1 campaigns: type: array items: $ref: '#/components/schemas/Campaign' type: object description: '' description: 'Campaigns _Present only when campaigns is included._' x-condition: 'Present only when campaigns is included.' created_at: type: string description: 'Created at' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'Updated at' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - order_weight - created_at - updated_at Checklist: type: object title: Checklist additionalProperties: false description: 'Represents a checklist for a lead in a campaign. A checklist has ChecklistFields that are filled out by a user, typically after a job done.' properties: id: type: integer description: 'Unique checklist identifier.' examples: - 1 campaign_id: type: integer description: 'Campaign identifier.' examples: - 101 name: type: string description: 'Checklist name.' examples: - 'Installment Checklist' slug: type: string description: 'Checklist slug.' examples: - installment-checklist max_submissions_total: type: - integer - 'null' description: 'Maximum total submissions allowed. Null means unlimited.' examples: - 10 max_submissions_per_user: type: - integer - 'null' description: 'Maximum submissions per user. Null means unlimited.' examples: - 1 intro_html: type: - string - 'null' description: 'Intro HTML content.' examples: - '

Hi

' icon_clz: type: - string - 'null' description: 'Icon CSS class.' examples: - 'fa fa-check' created_at: type: string description: 'When the checklist was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the checklist was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - campaign_id - name - slug - max_submissions_total - max_submissions_per_user - intro_html - icon_clz - created_at - updated_at ChecklistField: type: object title: ChecklistField additionalProperties: false properties: id: type: integer description: 'Unique checklist field identifier.' examples: - 1 name: type: string description: 'Field name.' examples: - 'Verify Email' slug: type: string description: 'Field slug.' examples: - verify-email checklist: $ref: '#/components/schemas/Checklist' type: object description: 'Checklist this field belongs to. _Present only when checklist is included._' x-condition: 'Present only when checklist is included.' created_at: type: string description: 'When the checklist field was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the checklist field was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - slug - created_at - updated_at ChecklistFieldValue: type: object title: ChecklistFieldValue additionalProperties: false description: 'Represents a value for a checklist field in a checklist submitted for a lead.' properties: id: type: integer description: 'Unique checklist field value identifier.' examples: - 1 value: type: - string - number - boolean - 'null' description: 'The stored value. A string, number or boolean, depending on the checklist field type.' examples: - 'Sample Value' checklist_field: $ref: '#/components/schemas/ChecklistField' type: object description: 'Checklist field this value belongs to.' created_at: type: string description: 'When the value was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the value was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - value - checklist_field - created_at - updated_at ChecklistSubmission: type: object title: ChecklistSubmission additionalProperties: false description: 'Represents a submission of a checklist for a lead in a campaign.' properties: id: type: integer description: 'Unique checklist submission identifier.' examples: - 1 checklist: $ref: '#/components/schemas/Checklist' type: object description: 'Checklist for this submission. _Present only when checklist is included._' x-condition: 'Present only when checklist is included.' checklist_field_values: type: array items: $ref: '#/components/schemas/ChecklistFieldValue' type: object description: '' description: 'Checklist field values recorded in this submission.' user: oneOf: - $ref: '#/components/schemas/User' type: object description: 'User who made this submission. _Present only when user is included._' x-condition: 'Present only when user is included.' - type: 'null' created_at: type: string description: 'When the submission was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the submission was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - checklist_field_values - created_at - updated_at Comment: type: object title: Comment additionalProperties: false description: 'Represents an internal comment on a lead in a campaign.' properties: id: type: integer description: 'Unique comment identifier.' examples: - 1 message: type: - string - 'null' description: 'Comment text.' examples: - 'This is a comment.' user_id: type: - integer - 'null' description: 'Identifier of the user who wrote this comment.' examples: - 1 user: oneOf: - $ref: '#/components/schemas/User' type: object description: 'User who wrote this comment. _Present only when user is included._' x-condition: 'Present only when user is included.' - type: 'null' created_at: type: string description: 'When the comment was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the comment was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - message - user_id - created_at - updated_at Consent: type: object title: Consent additionalProperties: false description: 'Represents the consent state for a single consent declaration.' properties: consented_at: type: - string - 'null' description: 'When consent was last given. Null if no consent exists.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - consented_at ConsentDeclaration: type: object title: ConsentDeclaration additionalProperties: false description: 'Consent declaration.' properties: id: type: string description: 'Unique consent declaration identifier (UUID).' examples: - 550e8400-e29b-41d4-a716-446655440000 name: type: string description: 'Name of the consent declaration.' examples: - 'Privacy Policy' description: type: - string - 'null' description: 'Description of the consent declaration.' examples: - 'Privacy policy description' url: type: - string - 'null' description: 'URL of the consent declaration.' examples: - 'https://example.com/privacy' consents_count: type: integer description: 'Number of consents, if counted. _Present only when `consents_count` is included._' x-condition: 'Present only when `consents_count` is included.' examples: - 10 campaigns: type: array items: $ref: '#/components/schemas/Campaign' type: object description: '' description: 'Campaigns using this consent declaration. _Present only when campaigns is included._' x-condition: 'Present only when campaigns is included.' urls: type: object title: Urls additionalProperties: false properties: api_resource: type: string examples: - 'https://api.leadvalidator.dk/consent-declarations/550e8400-e29b-41d4-a716-446655440000' required: - api_resource description: 'URLs for this consentdeclaration. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' consent_setting: type: object title: ConsentSetting additionalProperties: false properties: placeholders: type: object title: Placeholders additionalProperties: true properties: {} mandatory: type: boolean examples: - false created_at: type: string format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - placeholders - mandatory - created_at - updated_at description: 'Consent setting for this declaration. _Present when the declaration is included on a campaign._' x-condition: 'Present when the declaration is included on a campaign.' created_at: type: string description: 'When the consent declaration was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the consent declaration was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - description - url - created_at - updated_at Contact: type: object title: Contact additionalProperties: false description: 'A contact has a name and a unique email address. A contact can have multiple leads in different campaigns.' properties: id: type: integer description: 'Unique contact identifier.' examples: - 1 name: type: - string - 'null' description: 'Contact name.' examples: - 'John Doe' email: type: - string - 'null' description: 'Contact email address.' examples: - john.doe@example.com leads: type: array items: $ref: '#/components/schemas/Lead' type: object description: '' description: 'Leads linked to this contact. _Present only when leads is included._' x-condition: 'Present only when leads is included.' urls: type: object title: Urls additionalProperties: false properties: api_resource: type: string examples: - string required: - api_resource description: 'URLs for this contact. _Present if include_urls is true._' x-condition: 'Present if include_urls is true.' created_at: type: string description: 'When the contact was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the contact was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - email - created_at - updated_at DataField: type: object title: DataField additionalProperties: false description: 'JSON Schema based data field in a campaign. The value of a data field is a JSON object that conforms to the JSON Schema defined by the field.' properties: id: type: integer description: 'Unique data field identifier.' examples: - 1 uuid: type: string description: 'Unique data field UUID.' examples: - 550e8400-e29b-41d4-a716-446655440000 campaign_id: type: integer description: 'The ID of the campaign the field belongs to.' examples: - 101 campaign: $ref: '#/components/schemas/Campaign' type: object description: 'The campaign the field belongs to. _Present only when campaign is included._' x-condition: 'Present only when campaign is included.' name: type: string description: 'Display name.' examples: - 'Data Field' slug: type: string description: 'Slug identifier (API key name). Unique within a campaign.' examples: - data-field schema: type: object title: Schema additionalProperties: true properties: {} description: 'The JSON Schema that defines the structure and constraints of the data field.' icon: type: string description: 'The icon of the data field.' examples: - 'fa fa-database' handler: type: - string - 'null' description: 'The handler of the data field.' examples: - default api_requirement: type: integer description: 'The API requirement of the data field.' examples: - 1 lead_form_requirement: type: integer description: 'The lead form requirement of the data field.' examples: - 1 lead_form_visibility: type: integer description: 'The lead form visibility of the data field.' examples: - 1 lead_page_visibility: type: integer description: 'The lead page visibility of the data field.' examples: - 1 order_weight: type: integer description: 'The order weight of the field.' examples: - 1 created_at: type: string description: 'When the field was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the field was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - uuid - campaign_id - name - slug - schema - icon - handler - api_requirement - lead_form_requirement - lead_form_visibility - lead_page_visibility - order_weight - created_at - updated_at DataFieldValue: type: object title: DataFieldValue additionalProperties: false description: 'Represents a value for a data field for a lead in a campaign.' properties: id: type: integer description: 'Unique data field value identifier.' examples: - 1 value: type: - object - 'null' title: Value additionalProperties: true properties: {} description: "The stored value. Its shape follows the data field's own JSON schema." anonymized: type: boolean description: 'Whether this value has been anonymized.' examples: - false created_at: type: string description: 'When the value was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the value was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - value - anonymized - created_at - updated_at EconomicModel: type: object title: EconomicModel additionalProperties: false description: 'A curated slice of an e-conomic document (quotation, order, or booked invoice).' properties: type: type: string description: 'Document type: quotation, order, or booked_invoice.' examples: - booked_invoice number: type: - integer - 'null' description: 'Document number.' examples: - 1001 date: type: - string - 'null' description: 'Document date (ISO 8601).' examples: - string due_date: type: - string - 'null' description: 'Due date (ISO 8601).' examples: - string delivery_date: type: - string - 'null' description: 'Delivery date (ISO 8601).' examples: - string currency: type: - string - 'null' description: 'Currency code.' examples: - DKK vat_included: type: boolean description: 'Whether VAT is included in the amounts.' examples: - true reference: type: - string - 'null' description: 'Other reference text.' examples: - Ref123 note: type: - string - 'null' description: 'Document note text.' examples: - 'Payment within 8 days' sent: type: boolean description: 'Whether the document has been sent. _Present for quotations and orders only._' x-condition: 'Present for quotations and orders only.' examples: - true archived: type: boolean description: 'Whether the document has been archived. _Present for quotations and orders only._' x-condition: 'Present for quotations and orders only.' examples: - false order_number: type: - integer - 'null' description: 'Originating order number. _Present for booked invoices only._' x-condition: 'Present for booked invoices only.' examples: - 999 paid: type: boolean description: 'Whether the invoice has been paid. _Present for booked invoices only._' x-condition: 'Present for booked invoices only.' examples: - true pdf_url: type: - string - 'null' description: 'URL to download the document PDF.' examples: - 'https://example.com/invoice.pdf' totals: type: object title: Totals additionalProperties: false properties: net: type: number examples: - 1000.0 vat: type: number examples: - 250.0 gross: type: number examples: - 1250.0 rounding: type: number examples: - 0.0 remainder: type: number description: '_Present for booked invoices only._' x-condition: 'Present for booked invoices only.' examples: - 0.0 deduction: type: number description: '_Present for booked invoices only._' x-condition: 'Present for booked invoices only.' examples: - 0.0 margin: type: number description: '_Present for quotations and orders only._' x-condition: 'Present for quotations and orders only.' examples: - 500.0 margin_percent: type: number description: '_Present for quotations and orders only._' x-condition: 'Present for quotations and orders only.' examples: - 50.0 required: - net - vat - gross - rounding description: 'Document totals.' debtor: type: object title: Debtor additionalProperties: false properties: number: type: - string - 'null' examples: - '10001' name: type: - string - 'null' examples: - 'Acme Corp' email: type: - string - 'null' examples: - contact@acme.com phone: type: - string - 'null' examples: - '12345678' address: type: - string - 'null' examples: - 'Main St 1' postal_code: type: - string - 'null' examples: - '1000' city: type: - string - 'null' examples: - Copenhagen ean: type: - string - 'null' examples: - '5790000000000' required: - number - name - email - phone - address - postal_code - city - ean description: 'Debtor details.' employee: type: - object - 'null' title: Employee additionalProperties: false properties: number: type: - string - 'null' examples: - E01 name: type: - string - 'null' examples: - 'Jane Smith' email: type: - string - 'null' examples: - jane.smith@example.com phone: type: - string - 'null' examples: - '87654321' required: - number - name - email - phone description: 'Employee details. Null when no employee is linked.' required: - type - number - date - due_date - delivery_date - currency - vat_included - reference - note - pdf_url - totals - debtor - employee EnrichmentField: type: object title: EnrichmentField additionalProperties: false description: 'An enrichment field is a campaign attribute field that obtains its value automatically from an external API lookup. It can be scheduled to update its value periodically.' properties: id: type: integer description: 'Unique enrichment field identifier.' examples: - 1 campaign_id: type: integer description: 'The ID of the campaign the enrichment field belongs to.' examples: - 101 name: type: string description: 'Display name.' examples: - 'Company Name' slug: type: string description: 'Slug identifier (API key name). Unique within a campaign.' examples: - company-name active: type: boolean description: 'Whether the field is active. An inactive field will not have its value updated automatically.' examples: - true field_type: type: string description: 'The field type. A field type defines both the underlying data type, format and intend.' enum: - text - phone - email - name - first-name - middle-name - last-name - full-address - street-address - floor - postal - city-name - country - comment - db-datetime - db-date - db-time - db-birthdate - int - bool - url - license-plate - vehicle-vin - date - birthdate - cvr - company-name - homepage - currency-amount - currency - ipv4 - customer-id - other-id - call-id - url-html - json x-enumDescriptions: text: 'Default (string, max 191 characters)' phone: 'Phone (string)' email: 'Email (string)' name: 'Full name (string)' first-name: 'First name (string)' middle-name: 'Middle name (string)' last-name: 'Last name (string)' full-address: 'Full address (string)' street-address: 'Street addr. (string)' floor: 'Floor/Apartment/Subpremise (string)' postal: 'Postal code (string)' city-name: 'City name (string)' country: 'Country (string)' comment: 'Comment / Notes (long text, max 65535 characters)' db-datetime: 'Date & time (string, strict format: ISO 8601 UTC)' db-date: 'Date (string, strict format: YYYY-MM-DD)' db-time: 'Time of day (string, strict format: HH:MM:SS)' db-birthdate: 'Date of birth (string, strict format: YYYY-MM-DD)' int: 'Number (string, interpreted as integer)' bool: 'Checkbox type (string, interpreted as bool)' url: 'URL (string)' license-plate: 'License plate (string)' vehicle-vin: 'Vehicle ID (string)' date: 'Date (string, any format)' birthdate: 'Date of birth (string, any format)' cvr: 'CVR (string)' company-name: 'Company name (string)' homepage: 'URL homepage (string)' currency-amount: 'Amount in currency (string interpreted as decimal)' currency: 'Currency (string)' ipv4: 'IP address (string)' customer-id: 'Customer ID (string)' other-id: 'Other ID (string)' call-id: 'Call ID (string)' url-html: 'URL content (string)' json: 'JSON object (long text, formatted as JSON)' examples: - text order_weight: type: integer description: 'The order weight of the enrichment field. Used to sort enrichment fields in a campaign.' examples: - 1 created_at: type: string description: 'When the enrichment field was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the enrichment field was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - campaign_id - name - slug - active - field_type - order_weight - created_at - updated_at Field: type: object title: Field additionalProperties: false description: 'Attribute field in a campaign.' properties: id: type: integer description: 'Unique field identifier.' examples: - 1 campaign_id: type: integer description: 'The ID of the campaign the field belongs to.' examples: - 101 name: type: string description: 'Display name.' examples: - 'Customer Phone' slug: type: string description: 'Slug identifier (API key name). Unique within a campaign.' examples: - customer-phone is_pii: type: boolean description: 'Is personal identifiable information. The value in a PII field is deleted when the lead is anonymized.' examples: - true field_type: type: string description: 'The field type. A field type defines both the underlying data type, format and intended use.' enum: - text - phone - email - name - first-name - middle-name - last-name - full-address - street-address - floor - postal - city-name - country - comment - db-datetime - db-date - db-time - db-birthdate - int - bool - url - license-plate - vehicle-vin - date - birthdate - cvr - company-name - homepage - currency-amount - currency - ipv4 - customer-id - other-id - call-id - url-html - json x-enumDescriptions: text: 'Default (string, max 191 characters)' phone: 'Phone (string)' email: 'Email (string)' name: 'Full name (string)' first-name: 'First name (string)' middle-name: 'Middle name (string)' last-name: 'Last name (string)' full-address: 'Full address (string)' street-address: 'Street addr. (string)' floor: 'Floor/Apartment/Subpremise (string)' postal: 'Postal code (string)' city-name: 'City name (string)' country: 'Country (string)' comment: 'Comment / Notes (long text, max 65535 characters)' db-datetime: 'Date & time (string, strict format: ISO 8601 UTC)' db-date: 'Date (string, strict format: YYYY-MM-DD)' db-time: 'Time of day (string, strict format: HH:MM:SS)' db-birthdate: 'Date of birth (string, strict format: YYYY-MM-DD)' int: 'Number (string, interpreted as integer)' bool: 'Checkbox type (string, interpreted as bool)' url: 'URL (string)' license-plate: 'License plate (string)' vehicle-vin: 'Vehicle ID (string)' date: 'Date (string, any format)' birthdate: 'Date of birth (string, any format)' cvr: 'CVR (string)' company-name: 'Company name (string)' homepage: 'URL homepage (string)' currency-amount: 'Amount in currency (string interpreted as decimal)' currency: 'Currency (string)' ipv4: 'IP address (string)' customer-id: 'Customer ID (string)' other-id: 'Other ID (string)' call-id: 'Call ID (string)' url-html: 'URL content (string)' json: 'JSON object (long text, formatted as JSON)' examples: - phone data_format: type: string description: 'The data format of the field, if value is a strict format.' examples: - Any field_rules: type: array items: $ref: '#/components/schemas/FieldRule' type: object description: '' description: 'Field rules associated with this field. _Present only when field_rules is included._' x-condition: 'Present only when field_rules is included.' order_weight: type: integer description: 'Order weight of the field.' examples: - 1 created_at: type: string description: 'When the field was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the field was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - campaign_id - name - slug - is_pii - field_type - data_format - order_weight - created_at - updated_at FieldRule: type: object title: FieldRule additionalProperties: false description: 'Field rule configuration.' properties: slug: type: string description: 'Slug identifier.' examples: - required title: type: string description: 'Rule title.' examples: - Required params: type: object title: Params additionalProperties: true properties: {} description: 'Rule parameters. The keys depend on the rule.' rejection_msg: type: - string - 'null' description: 'Rejection message.' examples: - 'This field is required' required: - slug - title - params - rejection_msg FileField: type: object title: FileField additionalProperties: false description: 'File upload field in a campaign.' properties: id: type: integer description: 'Unique file field identifier.' examples: - 1 campaign_id: type: integer description: 'The ID of the campaign the field belongs to.' examples: - 101 name: type: string description: 'Display name.' examples: - 'File Upload' slug: type: string description: 'Slug identifier (API key name). Unique within a campaign.' examples: - file-upload order_weight: type: integer description: 'The order weight of the field.' examples: - 1 file_types: type: array items: type: string enum: - IMAGE - PDF - TEXT - OFFICE - OUTLOOK description: 'The field type. A upload file types supported by the file field.' created_at: type: string description: 'When the field was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the field was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - campaign_id - name - slug - order_weight - file_types - created_at - updated_at GpsStop: type: object title: GpsStop additionalProperties: false description: 'A recorded GPS stop (stationary period) at a location.' properties: id: type: integer description: 'Unique stop identifier.' examples: - 1 vehicle_id: type: integer description: 'ID of the vehicle that stopped.' examples: - 1 vehicle: $ref: '#/components/schemas/Vehicle' type: object description: 'Vehicle that made the stop. _Present only when vehicle is included._' x-condition: 'Present only when vehicle is included.' started_at: type: string description: 'When the stop started.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' ended_at: type: string description: 'When the stop ended.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' duration: type: integer description: 'Stop duration in seconds.' examples: - 120 lat: type: number description: 'Stop latitude.' examples: - 55.67247 lng: type: number description: 'Stop longitude.' examples: - 12.55692 urls: type: object title: Urls additionalProperties: false properties: api_resource: type: string examples: - 'https://api.leadvalidator.dk/gps-stops/1' google_maps: type: object title: GoogleMaps additionalProperties: false properties: location: type: string examples: - 'https://api.leadvalidator.dk' required: - location required: - api_resource - google_maps description: 'URLs for this gpsstop. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' created_at: type: string description: 'When the stop record was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the stop record was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - vehicle_id - started_at - ended_at - duration - lat - lng - created_at - updated_at GpsTrip: type: object title: GpsTrip additionalProperties: false description: 'A recorded GPS trip between two locations.' properties: id: type: integer description: 'Unique trip identifier.' examples: - 1 vehicle_id: type: integer description: 'ID of the vehicle that made the trip.' examples: - 1 vehicle: $ref: '#/components/schemas/Vehicle' type: object description: 'Vehicle that made the trip. _Present only when vehicle is included._' x-condition: 'Present only when vehicle is included.' started_at: type: string description: 'When the trip started.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' ended_at: type: string description: 'When the trip ended.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' duration: type: integer description: 'Trip duration in seconds.' examples: - 900 distance: type: number description: 'Total distance in metres.' examples: - 230.1 avg_speed: type: number description: 'Average speed in km/h.' examples: - 110.0 max_speed: type: number description: 'Maximum speed in km/h.' examples: - 120.5 lat_start: type: number description: 'Start latitude.' examples: - 83.37417 lng_start: type: number description: 'Start longitude.' examples: - -35.48351 lat_end: type: number description: 'End latitude.' examples: - 55.67247 lng_end: type: number description: 'End longitude.' examples: - 12.55692 urls: type: object title: Urls additionalProperties: false properties: api_resource: type: string examples: - 'https://api.leadvalidator.dk/gps-trips/1' google_maps: type: object title: GoogleMaps additionalProperties: false properties: start_location: type: string examples: - 'https://api.leadvalidator.dk' end_location: type: string examples: - 'https://api.leadvalidator.dk' required: - start_location - end_location required: - api_resource - google_maps description: 'URLs for this gpstrip. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' created_at: type: string description: 'When the trip record was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the trip record was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - vehicle_id - started_at - ended_at - duration - distance - avg_speed - max_speed - lat_start - lng_start - lat_end - lng_end - created_at - updated_at Lead: type: object title: Lead additionalProperties: false description: 'A lead is a single data entry (row) in a campaign. A lead can represent any type of record.' properties: id: type: integer description: 'Unique lead identifier.' examples: - 1 campaign_id: type: integer description: 'Identifier of the campaign this lead belongs to.' examples: - 1 campaign: $ref: '#/components/schemas/Campaign' type: object description: 'Campaign this lead belongs to. _Present only when campaign is included._' x-condition: 'Present only when campaign is included.' field_values: type: object title: FieldValues additionalProperties: true properties: {} description: "Standard field values keyed by field slug. Each value is the field's own scalar value. _Present only when `field_values` is included._" x-condition: 'Present only when `field_values` is included.' enrichment_field_values: type: object title: EnrichmentFieldValues additionalProperties: true properties: {} description: 'Enrichment field values keyed by api field slug. _Present only when `enrichment_field_values` is included._' x-condition: 'Present only when `enrichment_field_values` is included.' select_field_values: type: object title: SelectFieldValues additionalProperties: type: object properties: name: type: string slug: type: string properties: {} description: 'Select field values keyed by select field slug. _Present only when `select_field_values` is included._' x-condition: 'Present only when `select_field_values` is included.' file_field_uploads: type: object title: FileFieldUploads additionalProperties: $ref: '#/components/schemas/Upload' properties: {} description: 'Legacy attribute that may be removed in a future version: single file upload per file field, keyed by field slug (outdated). _Present only when `file_field_uploads` is included, and `file_field_values` is not._' x-condition: 'Present only when `file_field_uploads` is included, and `file_field_values` is not.' file_field_values: type: object title: FileFieldValues additionalProperties: type: array items: $ref: '#/components/schemas/Upload' properties: {} description: 'File field uploads keyed by file field slug, each containing an array of uploads. _Present only when `file_field_values` is included._' x-condition: 'Present only when `file_field_values` is included.' data_field_values: type: object title: DataFieldValues additionalProperties: $ref: '#/components/schemas/DataFieldValue' properties: {} description: 'Data field values keyed by data field slug. _Present only when `data_field_values` is included._' x-condition: 'Present only when `data_field_values` is included.' comments: type: array items: $ref: '#/components/schemas/Comment' type: object description: '' description: 'Comments on this lead. _Present only when comments is included._' x-condition: 'Present only when comments is included.' comment_uploads: type: array items: $ref: '#/components/schemas/Upload' type: object description: '' description: 'Comment file uploads on this lead. _Present only when comment_uploads is included._' x-condition: 'Present only when comment_uploads is included.' status: type: object title: Status additionalProperties: false properties: id: type: integer description: 'Status identifier.' examples: - 1 name: type: string description: 'Status name.' examples: - string slug: type: string description: 'Status slug.' examples: - string set_by_user_id: type: - integer - 'null' description: 'User who set the status. Null when it was not set by a user.' examples: - 1 set_by_automation: type: boolean description: 'Whether an automation set the status.' examples: - true set_by_api: type: boolean description: 'Whether an API request set the status.' examples: - true set_at: type: - string - 'null' description: 'When the status was set.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' reason: type: - string - 'null' description: 'Name of the reason given for the current status. _Present only when `status.reason` is included._' x-condition: 'Present only when `status.reason` is included.' examples: - string required: - id - name - slug - set_by_user_id - set_by_automation - set_by_api - set_at description: 'Current status of this lead. _Present only when `status` is included._' x-condition: 'Present only when `status` is included.' assignee: type: - object - 'null' title: Assignee additionalProperties: false properties: id: type: integer description: 'Assignee identifier.' examples: - 1 user_id: type: - integer - 'null' description: 'Identifier of the user this assignee belongs to. Null for an assignee without a user account.' examples: - 1 name: type: string description: 'Assignee name. _Present only when the assignee has no user account._' x-condition: 'Present only when the assignee has no user account.' examples: - string email: type: string description: 'Assignee email address. _Present only when the assignee has no user account._' x-condition: 'Present only when the assignee has no user account.' examples: - string user: $ref: '#/components/schemas/User' type: object description: 'The user this assignee belongs to. _Present only when `assignee.user` is included._' x-condition: 'Present only when `assignee.user` is included.' set_by_user_id: type: - integer - 'null' description: 'User who assigned the lead. Null when it was not assigned by a user.' examples: - 1 set_by_automation: type: boolean description: 'Whether an automation assigned the lead.' examples: - true set_at: type: - string - 'null' description: 'When the lead was assigned.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - user_id - set_by_user_id - set_by_automation - set_at description: 'Current assignee of this lead. _Present only when `assignee` is included._' x-condition: 'Present only when `assignee` is included.' nps_score: oneOf: - $ref: '#/components/schemas/NpsScore' type: object description: 'NPS score for this lead. _Present only when nps_score is included._' x-condition: 'Present only when nps_score is included.' - type: 'null' calendar_events: type: array items: $ref: '#/components/schemas/CalendarEvent' type: object description: '' description: 'Calendar events linked to this lead. _Present only when calendar_events is included._' x-condition: 'Present only when calendar_events is included.' utm_codes: type: object title: UtmCodes additionalProperties: false properties: utm_medium: type: - string - 'null' examples: - string utm_source: type: - string - 'null' examples: - string utm_campaign: type: - string - 'null' examples: - string utm_content: type: - string - 'null' examples: - string utm_term: type: - string - 'null' examples: - string required: - utm_medium - utm_source - utm_campaign - utm_content - utm_term description: 'UTM tracking codes. _Present only when `utm_codes` is included._' x-condition: 'Present only when `utm_codes` is included.' parent_leads: type: array items: $ref: '#/components/schemas/Lead' type: object description: '' description: 'Related parent leads. _Present only when parent_leads is included._' x-condition: 'Present only when parent_leads is included.' child_leads: type: array items: $ref: '#/components/schemas/Lead' type: object description: '' description: 'Related child leads. _Present only when child_leads is included._' x-condition: 'Present only when child_leads is included.' checklist_submissions: type: array items: $ref: '#/components/schemas/ChecklistSubmission' type: object description: '' description: 'Checklist submissions for this lead. _Present only when checklist_submissions is included._' x-condition: 'Present only when checklist_submissions is included.' contact: oneOf: - $ref: '#/components/schemas/Contact' type: object description: 'Contact linked to this lead. _Present only when contact is included._' x-condition: 'Present only when contact is included.' - type: 'null' economic: oneOf: - $ref: '#/components/schemas/EconomicModel' type: object description: 'E-conomic document linked to this lead. _Present only when economic is included._' x-condition: 'Present only when economic is included.' - type: 'null' urls: type: object title: Urls additionalProperties: false properties: profile_page: type: string examples: - string api_resource: type: string examples: - string web_pages: type: object title: WebPages additionalProperties: true properties: {} booking_forms: type: object title: BookingForms additionalProperties: true properties: {} required: - profile_page - api_resource - web_pages - booking_forms description: 'URLs for this lead. _Present if include_urls is true._' x-condition: 'Present if include_urls is true.' token: type: string description: 'Lead access token.' examples: - string token_short: type: string description: 'Short lead access token.' examples: - string created_at: type: string description: 'When the lead was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the lead was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' deleted_at: type: - string - 'null' description: 'When the lead was soft-deleted. _Present only when the lead is deleted._' x-condition: 'Present only when the lead is deleted.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - campaign_id - token - token_short - created_at - updated_at MicrosoftEvent: type: object title: MicrosoftEvent additionalProperties: false description: 'A calendar event imported from Microsoft 365.' properties: id: type: integer description: 'Unique event identifier.' examples: - 1 title: type: - string - 'null' description: 'Event title (redacted to "[private]" if the calendar visibility is restricted).' examples: - string location: type: - string - 'null' description: 'Event location (redacted to "[private]" if the calendar visibility is restricted).' examples: - string start: type: string description: 'Event start time.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' end: type: string description: 'Event end time.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' all_day: type: boolean description: 'Whether the event is an all-day event.' examples: - true private: type: boolean description: 'Whether the event is marked as private.' examples: - true type: type: string description: 'Meeting type slug.' examples: - string content_visibility: type: - string - 'null' description: 'Visibility setting label for this event.' examples: - string calendar_resources: type: array items: $ref: '#/components/schemas/CalendarResource' type: object description: '' description: 'Calendar resources attending this event. _Present only when calendar_resources is included._' x-condition: 'Present only when calendar_resources is included.' urls: type: object title: Urls additionalProperties: false properties: online_meeting_url: type: - string - 'null' examples: - string web_url: type: - string - 'null' examples: - string required: - online_meeting_url - web_url description: 'URLs for this event. _Present only when `include_urls` is true._' x-condition: 'Present only when `include_urls` is true.' created_at: type: string description: 'When the event was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the event was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - title - location - start - end - all_day - private - type - content_visibility - created_at - updated_at NpsScore: type: object title: NpsScore additionalProperties: false description: 'Represents an NPS score submitted by a lead for an NPS survey in a campaign.' properties: nps_survey_id: type: integer description: 'NPS survey identifier.' examples: - 1 score: type: - number - 'null' description: 'NPS score value.' examples: - 9 comment: type: - string - 'null' description: 'Comment text. _Present only when `comment` is included._' x-condition: 'Present only when `comment` is included.' examples: - string created_at: type: string description: 'When the NPS score was recorded.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the NPS score was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - nps_survey_id - score - created_at - updated_at NpsSurvey: type: object title: NpsSurvey additionalProperties: false description: 'NPS survey definition.' properties: id: type: integer description: 'Unique survey identifier.' examples: - 1 name: type: string description: 'Internal survey name.' examples: - 'Customer NPS' title: type: string description: 'Survey display title.' examples: - 'How likely are you to recommend us?' token: type: string description: 'Survey access token.' examples: - abc123token active: type: boolean description: 'Whether the survey is active.' examples: - true order_weight: type: integer description: 'Order weight of the survey.' examples: - 1 question: type: string description: 'Survey question.' examples: - 'How likely are you to recommend us?' lang: type: string description: 'Survey language code.' examples: - en product_name: type: string description: 'Product name.' examples: - 'Acme Corp' is_custom_question: type: boolean description: 'Whether the question is custom.' examples: - true created_at: type: string description: 'When the survey was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the survey was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - title - token - active - order_weight - question - lang - product_name - is_custom_question - created_at - updated_at Product: type: object title: Product additionalProperties: false description: 'A product or service in the product catalogue.' properties: id: type: integer description: 'Unique product identifier.' examples: - 1 product_category_id: type: - integer - 'null' description: 'ID of the product category.' examples: - 1 product_category: oneOf: - $ref: '#/components/schemas/ProductCategory' type: object description: 'Product category. _Present only when product_category is included._' x-condition: 'Present only when product_category is included.' - type: 'null' created_by_id: type: - integer - 'null' description: 'ID of the user who created the product.' examples: - 1 created_by: oneOf: - $ref: '#/components/schemas/User' type: object description: 'User who created the product. _Present only when created_by is included._' x-condition: 'Present only when created_by is included.' - type: 'null' updated_by_id: type: - integer - 'null' description: 'ID of the user who last updated the product.' examples: - 1 updated_by: oneOf: - $ref: '#/components/schemas/User' type: object description: 'User who last updated the product.. _Present only when updated_by is included._' x-condition: 'Present only when updated_by is included.' - type: 'null' deleted_by_id: type: - integer - 'null' description: 'ID of the user who deleted the product.' examples: - null deleted_by: oneOf: - $ref: '#/components/schemas/User' type: object description: 'User who deleted the product. _Present only when deleted_by is included._' x-condition: 'Present only when deleted_by is included.' - type: 'null' image_id: type: - integer - 'null' description: 'ID of the product image upload.' examples: - 1 image: oneOf: - $ref: '#/components/schemas/Upload' type: object description: 'Product image. _Present only when image is included._' x-condition: 'Present only when image is included.' - type: 'null' tags: type: array items: $ref: '#/components/schemas/ProductTag' type: object description: '' description: 'Product tags. _Present only when tags is included._' x-condition: 'Present only when tags is included.' product_fields: type: object title: ProductFields additionalProperties: true properties: {} description: 'Custom product field values keyed by field slug. _Present only when product_fields is included._' x-condition: 'Present only when product_fields is included.' type: type: string description: 'Product type.' enum: - physical - service - subscription - expense - other examples: - physical sku: type: - string - 'null' description: 'Stock-keeping unit identifier.' examples: - PROD-001 name: type: string description: 'Product name.' examples: - Consultation internal_name: type: - string - 'null' description: 'Internal product name.' examples: - 'Consultation Internal' description: type: - string - 'null' description: 'Product description.' examples: - 'Consultation service' internal_notes: type: - string - 'null' description: 'Internal notes.' examples: - 'Internal notes about consultation' unit: type: - string - 'null' description: 'Unit of measure.' examples: - pcs sales_price_minor: type: - integer - 'null' description: 'Sales price in minor currency units (e.g. cents).' examples: - 50000 cost_price_minor: type: - integer - 'null' description: 'Cost price in minor currency units.' examples: - 30000 effective_sales_price_minor: type: - integer - 'null' description: 'Effective sales price after overrides, in minor currency units.' examples: - 50000 effective_cost_price_minor: type: - integer - 'null' description: 'Effective cost price after overrides, in minor currency units.' examples: - 30000 currency_code: type: - string - 'null' description: 'ISO 4217 currency code.' examples: - DKK is_active: type: boolean description: 'Whether the product is active.' examples: - true is_bundle: type: boolean description: 'Whether the product is a bundle of other products.' examples: - false urls: type: object title: Urls additionalProperties: false properties: api_resource: type: string examples: - 'https://api.leadvalidator.dk/products/1' required: - api_resource description: 'URLs for this product. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' created_at: type: string description: 'When the product was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the product was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' deleted_at: type: - string - 'null' description: 'When the product was soft-deleted. _Present only when the product is deleted._' x-condition: 'Present only when the product is deleted.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - product_category_id - created_by_id - updated_by_id - deleted_by_id - image_id - type - sku - name - internal_name - description - internal_notes - unit - sales_price_minor - cost_price_minor - effective_sales_price_minor - effective_cost_price_minor - currency_code - is_active - is_bundle - created_at - updated_at ProductCategory: type: object title: ProductCategory additionalProperties: false description: 'Represents a product category. A product category is a grouping of products that share common characteristics or attributes.' properties: id: type: integer description: 'Unique product category identifier.' examples: - 1 name: type: string description: 'Category name.' examples: - 'Consultation Category' description: type: - string - 'null' description: 'Category description.' examples: - 'Category for consultations' color: type: - string - 'null' description: 'Category color hex value.' examples: - '#FF5733' is_active: type: boolean description: 'Whether the category is active.' examples: - true order_weight: type: integer description: 'Sort position.' examples: - 1 created_at: type: string description: 'When the category was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the category was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - description - color - is_active - order_weight - created_at - updated_at ProductTag: type: object title: ProductTag additionalProperties: false description: 'Represents a product tag. A product tag is a label or keyword used to categorize and organize products.' properties: id: type: integer description: 'Unique product tag identifier.' examples: - 1 name: type: string description: 'Tag name.' examples: - Premium created_at: type: string description: 'When the tag was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the tag was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - created_at - updated_at SelectField: type: object title: SelectField additionalProperties: false description: 'A select field is an attribute field that has a value from a predefined set of options.' properties: id: type: integer description: 'Unique select field identifier.' examples: - 1 campaign_id: type: integer description: 'Parent campaign ID.' examples: - 101 name: type: string description: 'Display name.' examples: - 'Lead Source' slug: type: string description: 'Slug name (API key name). Unique identifier within a campaign.' examples: - lead-source order_weight: type: integer description: 'Order weight.' examples: - 1 options: type: array items: $ref: '#/components/schemas/SelectFieldOption' type: object description: '' description: 'Select field options _Present only when options is included._' x-condition: 'Present only when options is included.' created_at: type: string description: 'Created at' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'Updated at' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - campaign_id - name - slug - order_weight - created_at - updated_at SelectFieldOption: type: object title: SelectFieldOption additionalProperties: false description: 'An option within a select field.' properties: id: type: integer description: 'Unique select field option identifier.' examples: - 1 select_field_id: type: integer description: 'Parent select field ID.' examples: - 1 name: type: string description: 'Display name.' examples: - 'Home page' slug: type: string description: 'Slug name (API key name). Unique identifier within a select field.' examples: - home-page color: type: - string - 'null' description: 'Option color when selected.' examples: - '#34D399' is_deactivated: type: boolean description: 'Whether the option is deactivated. If deactivated, the option will not be shown in the select field but existing leads having the option will still be able to select it.' examples: - false created_at: type: string description: 'Created at' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'Updated at' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - select_field_id - name - slug - color - is_deactivated - created_at - updated_at Status: type: object title: Status additionalProperties: false description: 'Status in a campaign.' properties: id: type: integer description: 'Unique field identifier.' examples: - 1 campaign_id: type: integer description: 'The ID of the campaign the status belongs to.' examples: - 101 name: type: string description: 'Display name.' examples: - Unhandled slug: type: string description: 'Slug identifier (API key name). Unique within a campaign.' examples: - unhandled color: type: - string - 'null' description: 'Color of the status when selected.' examples: - '#FF5733' order_weight: type: - integer - 'null' description: 'Order weight of the status.' examples: - 1 created_at: type: string description: 'When the field was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the field was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - campaign_id - name - slug - color - order_weight - created_at - updated_at TimeEntry: type: object title: TimeEntry additionalProperties: false description: 'A recorded time entry for a calendar resource.' properties: id: type: integer description: 'Unique time entry identifier.' examples: - 1 start: type: string description: 'When the time entry started.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' end: type: - string - 'null' description: 'When the time entry ended. Null if the entry is still running.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' comment: type: - string - 'null' description: 'Optional comment.' examples: - string break_minutes: type: - integer - 'null' description: 'Break duration in minutes.' examples: - 1 calendar_event: oneOf: - $ref: '#/components/schemas/CalendarEvent' type: object description: 'The calendar event this entry is linked to. _Present only when calendar_event is included._' x-condition: 'Present only when calendar_event is included.' - type: 'null' calendar_resource: $ref: '#/components/schemas/CalendarResource' type: object description: 'The calendar resource this entry belongs to. _Present only when calendar_resource is included._' x-condition: 'Present only when calendar_resource is included.' tags: type: array items: $ref: '#/components/schemas/TimeTag' type: object description: '' description: 'Time tags applied to this entry. _Present only when tags is included._' x-condition: 'Present only when tags is included.' created_at: type: string description: 'When the entry was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the entry was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - start - end - comment - break_minutes - created_at - updated_at TimeTag: type: object title: TimeTag additionalProperties: false description: 'Represents a time entry tag. A time tag is a label or keyword used to categorize and organize time-entries.' properties: id: type: integer description: 'Unique time tag identifier.' examples: - 1 name: type: string description: 'Tag name.' examples: - string exclusive: type: boolean description: 'Whether this tag is exclusive (only one exclusive tag can be applied at a time).' examples: - true created_at: type: string description: 'When the tag was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the tag was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - exclusive - created_at - updated_at Upload: type: object title: Upload additionalProperties: false description: 'Represents an uploaded file. An upload is a file that has been uploaded to the system for storage and retrieval.' properties: id: type: integer description: 'Unique upload identifier.' examples: - 1 name: type: - string - 'null' description: 'Public filename.' examples: - report.pdf title: type: - string - 'null' description: 'Upload title.' examples: - 'July Report' description: type: - string - 'null' description: 'Upload description.' examples: - 'Annual performance report' extension: type: - string - 'null' description: 'File extension.' examples: - pdf mime_type: type: string description: 'MIME type.' examples: - application/pdf file_type: type: string description: 'File type category.' enum: - image - pdf - text - csv - html - css - js - ics - video - audio - office - outlook - excel - other examples: - pdf kb: type: - number - 'null' description: 'File size in kilobytes.' examples: - 1024 url: type: - string - 'null' description: 'URL to download the file.' examples: - 'https://example.com/uploads/1/report.pdf' uploaded_by: oneOf: - $ref: '#/components/schemas/User' type: object description: 'User who uploaded the file. _Present only when uploaded_by is included._' x-condition: 'Present only when uploaded_by is included.' - type: 'null' ip_address: type: - string - 'null' description: 'IP address the file was uploaded from.' examples: - 127.0.0.1 created_at: type: string description: 'When the file was uploaded.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the upload was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - title - description - extension - mime_type - file_type - kb - url - ip_address - created_at - updated_at User: type: object title: User additionalProperties: false description: 'A user of the system.' properties: id: type: integer description: 'Unique user identifier.' examples: - 1 name: type: string description: 'User name.' examples: - 'John Doe' email: type: string description: 'User email.' examples: - john.doe@example.com phone: type: - string - 'null' description: 'User phone.' examples: - 000-000-0000 active: type: boolean description: 'Whether the user is active.' examples: - true department: type: - string - 'null' description: 'User department.' examples: - Sales role: type: - string - 'null' description: 'User role.' examples: - 'Sales Executive' user_tags: type: array items: $ref: '#/components/schemas/UserTag' type: object description: '' description: 'User tags attached to this user. _Present only when user_tags is included._' x-condition: 'Present only when user_tags is included.' calendar_resource: $ref: '#/components/schemas/CalendarResource' type: object description: 'Calendar resource associated with this user. _Present only when calendar_resource is included._' x-condition: 'Present only when calendar_resource is included.' user_field_values: type: object title: UserFieldValues additionalProperties: true properties: {} description: 'User field values. _Present only when `user_field_values` is included._' x-condition: 'Present only when `user_field_values` is included.' urls: type: object title: Urls additionalProperties: false properties: api_resource: type: string examples: - 'https://api.leadvalidator.dk/users/1' required: - api_resource description: 'URLs for this user. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' last_seen_at: type: - string - 'null' description: 'When the user last was last active on the system.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' deactivated_at: type: - string - 'null' description: 'When the user was deactivated. Null if the user is active.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' created_at: type: string description: 'When the user was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the user was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - email - phone - active - department - role - last_seen_at - deactivated_at - created_at - updated_at UserTag: type: object title: UserTag additionalProperties: false description: 'A user tag groups users. A user can have many tags and a tag can have many users. A user tag can provide abilities, permissions and default values to the users it is assigned to.' properties: id: type: integer description: 'Unique user tag identifier.' examples: - 1 name: type: string description: 'User tag name.' examples: - Sales user_tag_group: $ref: '#/components/schemas/UserTagGroup' type: object description: 'User tag group linked to this user tag. _Present only when user_tag_group is included._' x-condition: 'Present only when user_tag_group is included.' user_has_calendar: type: boolean description: 'Whether the user tag has a calendar.' examples: - true user_default_values: type: - object - 'null' title: UserDefaultValues additionalProperties: false properties: role: type: string description: 'User role attribute default value. _Present if set_' x-condition: 'Present if set' examples: - string department: type: string description: 'User department attribute default value. _Present if set_' x-condition: 'Present if set' examples: - string bg_color: type: string description: 'Calendar background color default value. _Present if set_' x-condition: 'Present if set' examples: - string base_location: type: string description: 'Calendar resource base location default value. _Present if set_' x-condition: 'Present if set' examples: - string base_location_after: type: string description: 'Calendar return base location default value. _Present if set_' x-condition: 'Present if set' examples: - string operable_postal_codes: type: string description: 'Calendar resource operable postal codes default value. _Present if set_' x-condition: 'Present if set' examples: - string startpage: type: - integer - 'null' description: 'Users default start page when logging in on desktop. Possible values: null: Default. 1: Personal calendar. 2: Internal page. 3: System home. 4: Shared calendar _Present if set_' x-condition: 'Present if set' examples: - 1 start_page_id: type: integer description: 'Refers to an internal page ID if the default start page on desktop is an internal page (2). _Present if set_' x-condition: 'Present if set' examples: - 1 startpage_mobile: type: - integer - 'null' description: 'Users default start page when logging in on mobile. Possible values: null: Default. 1: Personal calendar. 2: Internal page. 3: System home. 4: Shared calendar _Present if set_' x-condition: 'Present if set' examples: - 1 mobile_page_id: type: integer description: 'Refers to an internal page ID if the default start page on mobile is an internal page (2). _Present if set_' x-condition: 'Present if set' examples: - 1 description: 'Default values for users having this tag, keyed by attribute name.' order_weight: type: integer description: 'Order weight of the user tag.' examples: - 1 created_at: type: string description: 'When the user tag was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the user tag was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - user_has_calendar - user_default_values - order_weight - created_at - updated_at UserTagGroup: type: object title: UserTagGroup additionalProperties: false description: 'User tag group.' properties: id: type: integer description: 'Unique user tag group identifier.' examples: - 1 name: type: string description: 'User tag group name.' examples: - Region user_tags: type: array items: $ref: '#/components/schemas/UserTag' type: object description: '' description: 'User tags in this group. _Present only when user_tags is included._' x-condition: 'Present only when user_tags is included.' order_weight: type: integer description: 'Order weight of the user tag group.' examples: - 1 created_at: type: string description: 'When the user tag group was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the user tag group was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - order_weight - created_at - updated_at Vehicle: type: object title: Vehicle additionalProperties: false description: 'A GPS-tracked vehicle.' properties: id: type: integer description: 'Unique vehicle identifier.' examples: - 1 name: type: string description: 'Vehicle name.' examples: - 'Truck 1' color: type: - string - 'null' description: 'Vehicle color.' examples: - '#FF5733' license_plate: type: - string - 'null' description: 'License plate number.' examples: - AB12345 description: type: - string - 'null' description: 'Vehicle description.' examples: - 'Main cargo truck' tracker: type: - object - 'null' title: Tracker additionalProperties: false properties: id: type: integer examples: - 101 name: type: string examples: - 'GPS tracker 101' phone: type: - string - 'null' examples: - '12345678' imei: type: string examples: - '123456789012345' status: type: string examples: - online disabled: type: boolean examples: - false last_update: type: string format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - phone - imei - status - disabled - last_update description: 'GPS tracker device info. _Present only when `tracker` is included._' x-condition: 'Present only when `tracker` is included.' position: type: - object - 'null' title: Position additionalProperties: false properties: lat: type: number examples: - 55.67563 lng: type: number examples: - 12.56954 altitude: type: - number - 'null' examples: - 5.0 kph: type: number examples: - 0.0 course: type: number examples: - 270.0 ignition: type: - boolean - 'null' examples: - false motion: type: - boolean - 'null' examples: - false satellites: type: - integer - 'null' examples: - 16 timestamp: type: string format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - lat - lng - altitude - kph - course - ignition - motion - satellites - timestamp description: 'Latest GPS position. _Present only when `position` is included._' x-condition: 'Present only when `position` is included.' current_resources: type: array items: $ref: '#/components/schemas/CalendarResource' type: object description: '' description: 'Calendar resources currently assigned to this vehicle. _Present only when current_resources is included._' x-condition: 'Present only when current_resources is included.' urls: type: object title: Urls additionalProperties: false properties: api_resource: type: string examples: - 'https://api.leadvalidator.dk/vehicles/1' required: - api_resource description: 'URLs for this vehicle. _Present only if `include_urls` is set to `true`._' x-condition: 'Present only if `include_urls` is set to `true`.' created_at: type: string description: 'When the vehicle was created.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' updated_at: type: string description: 'When the vehicle was last updated.' format: date-time examples: - '2026-01-15T09:30:00.000000Z' required: - id - name - color - license_plate - description - created_at - updated_at security: - default: [] paths: /absences: get: summary: 'List absences' operationId: listAbsences description: 'Returns a paginated list of absences. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'This endpoint limits the maximum number of results per page to 100 (default: 25)' required: false schema: type: integer description: 'This endpoint limits the maximum number of results per page to 100 (default: 25)' examples: - 100 - in: query name: include description: 'Available relationships: `user`, `user.calendar_resource`' required: false schema: type: string description: 'Available relationships: `user`, `user.calendar_resource`' examples: default: value: 'user,user.calendar_resource' x-disabled: false allowReserved: true - in: query name: sort description: "Available sort options: `id`, `start`, `end`, `type`, `status`, `decided_at`, `created_at`, `updated_at`\n\nPrefix an option with `-` to sort descending, e.g. `-start`.\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `start`, `end`, `type`, `status`, `decided_at`, `created_at`, `updated_at`\n\nPrefix an option with `-` to sort descending, e.g. `-start`.\n\nDefault: `id`" examples: - '-updated_at' - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - true - in: query name: include_working_days description: "Whether to include the number of working days each absence covers. Weekends and the public holidays\nof the account's holiday calendar are excluded.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include the number of working days each absence covers. Weekends and the public holidays\nof the account's holiday calendar are excluded.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - true - in: query name: 'filter[id]' description: 'Filter by absence id.' required: false schema: type: string description: 'Filter by absence id.' examples: - '1' - in: query name: 'filter[self]' description: "Filter absences using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `user_id`, `type`, `status`, `start`, `end`, `user_note`, `decided_at`, `decided_by_user_id`, `created_at`, `updated_at`\n\n`start` and `end` are dates, and both are inclusive.\n\nExample: `status = pending, start >= today`" required: false schema: type: string description: "Filter absences using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `user_id`, `type`, `status`, `start`, `end`, `user_note`, `decided_at`, `decided_by_user_id`, `created_at`, `updated_at`\n\n`start` and `end` are dates, and both are inclusive.\n\nExample: `status = pending, start >= today`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[type]' description: 'Type of absence.' required: false schema: type: string description: 'Type of absence.' enum: - vacation - paid_leave - unpaid_leave - other examples: - vacation - in: query name: 'filter[status]' description: 'Absence approval status.' required: false schema: type: string description: 'Absence approval status.' enum: - pending - approved - denied examples: - pending - in: query name: 'filter[overlapping]' description: "Absences intersecting a period, given as two dates separated by `;`. Both dates are inclusive.\n\nExample: `2026-07-01;2026-07-31` returns every absence that covers at least one day of July 2026." required: false schema: type: string description: "Absences intersecting a period, given as two dates separated by `;`. Both dates are inclusive.\n\nExample: `2026-07-01;2026-07-31` returns every absence that covers at least one day of July 2026." examples: - 2026-07-01;2026-07-31 - in: query name: 'filter[year]' description: 'Absences intersecting a calendar year. Short for `filter[overlapping]=YYYY-01-01;YYYY-12-31`.' required: false schema: type: integer description: 'Absences intersecting a calendar year. Short for `filter[overlapping]=YYYY-01-01;YYYY-12-31`.' examples: - 2026 - in: query name: 'filter[user]' description: "Filter absences by the absent user using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `email`, `department`, `role`\n\nExample: `email LIKE *@example.com`" required: false schema: type: string description: "Filter absences by the absent user using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `email`, `department`, `role`\n\nExample: `email LIKE *@example.com`" examples: - 'email LIKE *@example.com' - in: query name: 'filter[created_after]' description: 'Filter by created timestamp.' required: false schema: type: string description: 'Filter by created timestamp.' examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: 'Filter by updated timestamp.' required: false schema: type: string description: 'Filter by updated timestamp.' examples: - '2026-01-15T08:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Absence' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' calendar_resource: id: 1 type: user user_id: 1 active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' type: vacation type_label: Vacation start: '2026-12-23' end: '2027-01-02' user_note: 'Merry christmas!' status: pending status_label: Pending decided_at: null decided_by_user_id: null created_at: '2026-09-15T09:30:00.000000Z' updated_at: '2026-09-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/absences?page=1' last: 'https://api.leadvalidator.dk/absences?page=5' prev: null next: 'https://api.leadvalidator.dk/absences?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/absences' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Absences post: summary: 'Register absence' operationId: registerAbsence description: 'The absence is created as pending. Approving or rejecting it is done in Hubhus, where the decision is recorded with the deciding user.' responses: '201': description: 'Successfully created.' content: application/json: schema: $ref: '#/components/schemas/Absence' examples: default: value: id: 1 user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' calendar_resource: id: 1 type: user user_id: 1 active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' type: vacation type_label: Vacation start: '2026-12-23' end: '2027-01-02' user_note: 'Merry christmas!' status: pending status_label: Pending decided_at: null decided_by_user_id: null created_at: '2026-09-15T09:30:00.000000Z' updated_at: '2026-09-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '422': description: 'One or more input parameters are invalid.' content: application/json: schema: type: object properties: message: type: string examples: - 'The data was invalid.' errors: type: object properties: '{parameter}': type: array items: type: string examples: - - 'The {parameter} field is required.' examples: - message: 'The data was invalid.' errors: '{parameter}': - 'The {parameter} field is required.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Absences requestBody: required: true content: application/json: schema: type: object properties: user_id: type: integer description: 'The absent user. Absences are always registered for a specific user.' examples: - 1 type: type: string description: 'Type of absence.' examples: - vacation start: type: string description: 'First day of the absence. Format: YYYY-MM-DD' examples: - '2026-09-14' end: type: string description: 'Last day of the absence, inclusive. Must not be before `start`, and may not be more than two years ahead. Format: YYYY-MM-DD' examples: - '2026-09-18' user_note: type: string description: "The absent user's own note about the absence. Required for every type but `vacation`." examples: - 'Family trip' required: - user_id - type - start - end '/absences/{id}': get: summary: 'Show absence' operationId: showAbsence description: 'Returns a single absence. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `user`, `user.calendar_resource`' required: false schema: type: string description: 'Available relationships: `user`, `user.calendar_resource`' examples: default: value: 'user,user.calendar_resource' x-disabled: false allowReserved: true - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - true - in: query name: include_working_days description: "Whether to include the number of working days each absence covers. Weekends and the public holidays\nof the account's holiday calendar are excluded.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include the number of working days each absence covers. Weekends and the public holidays\nof the account's holiday calendar are excluded.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - true responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/Absence' examples: default: value: id: 1 user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' calendar_resource: id: 1 type: user user_id: 1 active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' type: vacation type_label: Vacation start: '2026-12-23' end: '2027-01-02' user_note: 'Merry christmas!' status: pending status_label: Pending decided_at: null decided_by_user_id: null created_at: '2026-09-15T09:30:00.000000Z' updated_at: '2026-09-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Absences parameters: - in: path name: id description: 'The ID of the absence.' required: true schema: type: integer examples: - 6 /booking-forms: get: summary: 'List booking forms' operationId: listBookingForms description: 'Returns a paginated list of booking forms. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: include description: 'Available relationships: `campaign`, `calendar_resources`, `calendar_resources.user`,' required: false schema: type: string description: 'Available relationships: `campaign`, `calendar_resources`, `calendar_resources.user`,' examples: default: value: calendar_resources.user x-disabled: false allowReserved: true - in: query name: sort description: "Available sort options: `id`, `campaign_id`, `name`, `order_weight`, `created_at`, `updated_at`\n\nDefault: `campaign_id,order_weight,id`" required: false schema: type: string description: "Available sort options: `id`, `campaign_id`, `name`, `order_weight`, `created_at`, `updated_at`\n\nDefault: `campaign_id,order_weight,id`" examples: - name - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: 'filter[campaign_id]' description: 'Filter by campaign' required: false schema: type: integer description: 'Filter by campaign' examples: - 101 - in: query name: 'filter[self]' description: "Filter booking forms by various properties using [expression filters](#description/expression-filters)..\n\nAvailable properties: `id`, `campaign_id`, `name`, `slug`, `token`, `created_at`, `updated_at`\n\nExamples:\n\n`updated_at > now -1 month`\n\n`slug = book-now`" required: false schema: type: string description: "Filter booking forms by various properties using [expression filters](#description/expression-filters)..\n\nAvailable properties: `id`, `campaign_id`, `name`, `slug`, `token`, `created_at`, `updated_at`\n\nExamples:\n\n`updated_at > now -1 month`\n\n`slug = book-now`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[created_after]' description: 'Filter by created timestamp.' required: false schema: type: string description: 'Filter by created timestamp.' examples: - '2026-01-15T13:30:00Z' - in: query name: 'filter[updated_after]' description: 'Filter by created timestamp.' required: false schema: type: string description: 'Filter by created timestamp.' examples: - '2026-01-15T13:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/BookingForm' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 campaign_id: 101 name: 'Consultation Booking' slug: consultation-booking token: abc123token calendar_resources: - id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' campaign: id: 101 name: Leads campaign_group_id: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/booking-forms?page=1' last: 'https://api.leadvalidator.dk/booking-forms?page=5' prev: null next: 'https://api.leadvalidator.dk/booking-forms?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/booking-forms' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Booking Forms' '/booking-forms/{id}': get: summary: 'Show booking form' operationId: showBookingForm description: 'Returns a single booking form. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `campaign`, `calendar_resources`, `calendar_resources.user`,' required: false schema: type: string description: 'Available relationships: `campaign`, `calendar_resources`, `calendar_resources.user`,' examples: default: value: calendar_resources.user x-disabled: false allowReserved: true - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/BookingForm' examples: default: value: id: 1 campaign_id: 101 name: 'Consultation Booking' slug: consultation-booking token: abc123token calendar_resources: - id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' campaign: id: 101 name: Leads campaign_group_id: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Booking Forms' parameters: - in: path name: id description: 'The ID of the booking form.' required: true schema: type: integer examples: - 6 '/booking-forms/{booking_form_id}/optimal-datetime-slots': get: summary: 'List optimal slots' operationId: listOptimalSlots description: 'Get a list of optimal, available datetime slots in the calendar, found by the booking form' parameters: - in: query name: calendar_resource_id description: 'Calendar resource ID. Specifies a single calendar to look in. Optional.' required: false schema: type: integer description: 'Calendar resource ID. Specifies a single calendar to look in. Optional.' examples: - 1 - in: query name: calendar_resource_ids description: 'Used instead of calendar_resource_id if looking in multiple calendars. Comma-separated list, or an array, of integers. Optional.' required: false schema: type: string description: 'Used instead of calendar_resource_id if looking in multiple calendars. Comma-separated list, or an array, of integers. Optional.' examples: - '1,2,3' - in: query name: duration description: 'Meeting duration in minutes. Optional.' required: false schema: type: integer description: 'Meeting duration in minutes. Optional.' examples: - 60 - in: query name: earliest_date description: 'The earliest possible date to book. Optional. Format: YYYY-mm-dd' required: false schema: type: string description: 'The earliest possible date to book. Optional. Format: YYYY-mm-dd' examples: - '2024-03-10' - in: query name: latest_date description: 'The latest possible date to book. Optional. Format: YYYY-mm-dd' required: false schema: type: string description: 'The latest possible date to book. Optional. Format: YYYY-mm-dd' examples: - '2024-03-20' - in: query name: arrival_interval_set_id description: 'Specify an arrival interval set used when suggesting time slots. Overrides the default arrival interval set specified on the Booking Form.' required: false schema: type: integer description: 'Specify an arrival interval set used when suggesting time slots. Overrides the default arrival interval set specified on the Booking Form.' examples: - 1 - in: query name: full_address description: 'Full address for meeting. Must include street, number and postal code. Required only for booking forms with location activated' required: true schema: type: string description: 'Full address for meeting. Must include street, number and postal code. Required only for booking forms with location activated' examples: - 'Street 23, 1122 City' - in: query name: include description: 'Include data in response. Values: calendar_resources' required: false schema: type: string description: 'Include data in response. Values: calendar_resources' examples: default: value: calendar_resources.user x-disabled: false allowReserved: true responses: '200': description: 'Success response' content: application/json: schema: type: object properties: data: type: array items: type: object properties: calendar_resource_ids: type: array items: type: integer examples: - - 4000 from: type: string examples: - '2024-07-16T08:00:00Z' to: type: string examples: - '2024-07-16T09:00:00Z' full_address: type: string examples: - 'Street 23, 1122 City' start_time_interval: type: object properties: from: type: string examples: - '10:00' to: type: string examples: - '12:20' label: type: string examples: - 'Tidsrummet 10:00 - 12:20' idx_on_day: type: integer examples: - 0 transit_weight_minutes: type: integer examples: - 6 transit_weight_meters: type: integer examples: - 2347 saved_co2_kg: type: number examples: - 0.31 is_preferred_slot: type: boolean examples: - true position_in_interval: type: string examples: - first examples: - - calendar_resource_ids: - 4000 from: '2024-07-16T08:00:00Z' to: '2024-07-16T09:00:00Z' full_address: 'Street 23, 1122 City' start_time_interval: from: '10:00' to: '12:20' label: 'Tidsrummet 10:00 - 12:20' idx_on_day: 0 transit_weight_minutes: 6 transit_weight_meters: 2347 saved_co2_kg: 0.31 is_preferred_slot: true position_in_interval: first - calendar_resource_ids: - 5000 from: '2024-07-17T10:30:00Z' to: '2024-07-17T11:30:00Z' full_address: 'Street 23, 1122 City' start_time_interval: from: '12:20' to: '14:40' label: 'Tidsrummet 12:20 - 14:40' idx_on_day: 1 transit_weight_minutes: 12 transit_weight_meters: 4694 saved_co2_kg: 0 is_preferred_slot: true position_in_interval: first - calendar_resource_ids: - 6000 from: '2024-07-18T13:54:00Z' to: '2024-07-18T14:54:00Z' full_address: 'Street 23, 1122 City' start_time_interval: from: '14:40' to: '17:00' label: 'Tidsrummet 14:40 - 17:00' idx_on_day: 2 transit_weight_minutes: 6 transit_weight_meters: 2347 saved_co2_kg: 0.31 is_preferred_slot: true position_in_interval: last examples: - data: - calendar_resource_ids: - 4000 from: '2024-07-16T08:00:00Z' to: '2024-07-16T09:00:00Z' full_address: 'Street 23, 1122 City' start_time_interval: from: '10:00' to: '12:20' label: 'Tidsrummet 10:00 - 12:20' idx_on_day: 0 transit_weight_minutes: 6 transit_weight_meters: 2347 saved_co2_kg: 0.31 is_preferred_slot: true position_in_interval: first - calendar_resource_ids: - 5000 from: '2024-07-17T10:30:00Z' to: '2024-07-17T11:30:00Z' full_address: 'Street 23, 1122 City' start_time_interval: from: '12:20' to: '14:40' label: 'Tidsrummet 12:20 - 14:40' idx_on_day: 1 transit_weight_minutes: 12 transit_weight_meters: 4694 saved_co2_kg: 0 is_preferred_slot: true position_in_interval: first - calendar_resource_ids: - 6000 from: '2024-07-18T13:54:00Z' to: '2024-07-18T14:54:00Z' full_address: 'Street 23, 1122 City' start_time_interval: from: '14:40' to: '17:00' label: 'Tidsrummet 14:40 - 17:00' idx_on_day: 2 transit_weight_minutes: 6 transit_weight_meters: 2347 saved_co2_kg: 0.31 is_preferred_slot: true position_in_interval: last '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '422': description: 'Parameters rejected' content: application/json: schema: type: object properties: message: type: string examples: - 'Invalid address' errors: type: object properties: full_address: type: string examples: - 'Invalid address' examples: - message: 'Invalid address' errors: full_address: 'Invalid address' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Booking Forms' parameters: - in: path name: booking_form_id description: 'The ID of the booking form.' required: true schema: type: integer examples: - 6 '/booking-forms/{booking_form_id}/available-dates': get: summary: 'List available dates' operationId: listAvailableDates description: 'Get a list of available dates within a month, found by the booking form.' parameters: - in: query name: calendar_resource_id description: 'Calendar resource ID. Specifies a single calendar to look in. Optional.' required: false schema: type: integer description: 'Calendar resource ID. Specifies a single calendar to look in. Optional.' examples: - 1 - in: query name: calendar_resource_ids description: 'Used instead of calendar_resource_id if looking in multiple calendars. Comma-separated list, or an array, of integers. Optional.' required: false schema: type: string description: 'Used instead of calendar_resource_id if looking in multiple calendars. Comma-separated list, or an array, of integers. Optional.' examples: - '1,2,3' - in: query name: duration description: 'Meeting duration in minutes. Optional.' required: false schema: type: integer description: 'Meeting duration in minutes. Optional.' examples: - 60 - in: query name: from_date description: "Search available dates starting from this date to the end of the date's month. Optional. Default: Today" required: false schema: type: string description: "Search available dates starting from this date to the end of the date's month. Optional. Default: Today" examples: - '2024-03-01' - in: query name: earliest_date description: 'The earliest possible date to book. Optional. Format: YYYY-mm-dd. Note: This parameter is complementary to `from_date`. Only dates after, and within the month defined by, the `from_date` parameter are returned' required: false schema: type: string description: 'The earliest possible date to book. Optional. Format: YYYY-mm-dd. Note: This parameter is complementary to `from_date`. Only dates after, and within the month defined by, the `from_date` parameter are returned' examples: - '2024-03-10' - in: query name: latest_date description: 'The latest possible date to book. Optional. Format: YYYY-mm-dd. Note: This parameter is complementary to `from_date`. Only dates within the month defined by the `from_date` parameter are returned' required: false schema: type: string description: 'The latest possible date to book. Optional. Format: YYYY-mm-dd. Note: This parameter is complementary to `from_date`. Only dates within the month defined by the `from_date` parameter are returned' examples: - '2024-03-20' - in: query name: full_address description: 'Full address for meeting. Must include street, number and postal code. Required only for booking forms with location activated' required: true schema: type: string description: 'Full address for meeting. Must include street, number and postal code. Required only for booking forms with location activated' examples: - 'Street 23, 1122 City' responses: '200': description: 'Success response' content: application/json: schema: type: object properties: data: type: array description: 'The available dates within the time period (all in same month). Format: YYYY-mm-dd' items: type: string examples: - - '2024-03-01' - '2024-03-10' - '2024-03-12' required: - data examples: - data: - '2024-03-01' - '2024-03-10' - '2024-03-12' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '422': description: 'Parameters rejected' content: application/json: schema: type: object properties: message: type: string examples: - 'Invalid address' errors: type: object properties: full_address: type: string examples: - 'Invalid address' examples: - message: 'Invalid address' errors: full_address: 'Invalid address' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Booking Forms' parameters: - in: path name: booking_form_id description: 'The ID of the booking form.' required: true schema: type: integer examples: - 6 '/booking-forms/{booking_form_id}/available-time-slots': get: summary: 'List available slots' operationId: listAvailableSlots description: 'Get a list of available time slots on a given date. The time slots are picked by the booking form.' parameters: - in: query name: calendar_resource_id description: 'Calendar resource ID. Specifies a single calendar to look in. Optional.' required: false schema: type: integer description: 'Calendar resource ID. Specifies a single calendar to look in. Optional.' examples: - 1 - in: query name: calendar_resource_ids description: 'Used instead of calendar_resource_id if looking in multiple calendars. Comma-separated list, or an array, of integers. Optional.' required: false schema: type: string description: 'Used instead of calendar_resource_id if looking in multiple calendars. Comma-separated list, or an array, of integers. Optional.' examples: - '1,2,3' - in: query name: duration description: 'Meeting duration in minutes. Optional.' required: false schema: type: integer description: 'Meeting duration in minutes. Optional.' examples: - 60 - in: query name: selected_date description: 'Date to search. Format: YYYY-mm-dd' required: true schema: type: string description: 'Date to search. Format: YYYY-mm-dd' examples: - '2024-03-01' - in: query name: arrival_interval_set_id description: 'Specify an arrival interval set used when suggesting time slots. Overrides the default arrival interval set specified on the Booking Form.' required: false schema: type: integer description: 'Specify an arrival interval set used when suggesting time slots. Overrides the default arrival interval set specified on the Booking Form.' examples: - 1 - in: query name: full_address description: 'Full address for meeting. Must include street, number and postal code. Required only for booking forms with location activated' required: true schema: type: string description: 'Full address for meeting. Must include street, number and postal code. Required only for booking forms with location activated' examples: - 'Street 23, 1122 City' - in: query name: include description: 'Include data in response. Values: calendar_resources' required: false schema: type: string description: 'Include data in response. Values: calendar_resources' examples: default: value: calendar_resources.user x-disabled: false allowReserved: true responses: '200': description: 'Success response' content: application/json: schema: type: object properties: data: type: array items: type: object properties: calendar_resource_ids: type: array items: type: integer examples: - - 6372 from: type: string examples: - '2024-07-16T08:00:00Z' to: type: string examples: - '2024-07-16T09:00:00Z' full_address: type: string examples: - 'Street 23, 1122 City' start_time_interval: type: object properties: from: type: string examples: - '10:00' to: type: string examples: - '12:20' label: type: string examples: - 'Tidsrummet 10:00 - 12:20' idx_on_day: type: integer examples: - 0 transit_weight_minutes: type: integer examples: - 6 transit_weight_meters: type: integer examples: - 2347 saved_co2_kg: type: number examples: - 0.31 is_preferred_slot: type: boolean examples: - true position_in_interval: type: string examples: - first examples: - - calendar_resource_ids: - 6372 from: '2024-07-16T08:00:00Z' to: '2024-07-16T09:00:00Z' full_address: 'Street 23, 1122 City' start_time_interval: from: '10:00' to: '12:20' label: 'Tidsrummet 10:00 - 12:20' idx_on_day: 0 transit_weight_minutes: 6 transit_weight_meters: 2347 saved_co2_kg: 0.31 is_preferred_slot: true position_in_interval: first - calendar_resource_ids: - 6372 from: '2024-07-16T10:30:00Z' to: '2024-07-16T11:30:00Z' full_address: 'Street 23, 1122 City' start_time_interval: from: '12:20' to: '14:40' label: 'Tidsrummet 12:20 - 14:40' idx_on_day: 1 transit_weight_minutes: 12 transit_weight_meters: 4694 saved_co2_kg: 0 is_preferred_slot: false position_in_interval: middle - calendar_resource_ids: - 6372 from: '2024-07-16T13:54:00Z' to: '2024-07-16T14:54:00Z' full_address: 'Street 23, 1122 City' start_time_interval: from: '14:40' to: '17:00' label: 'Tidsrummet 14:40 - 17:00' idx_on_day: 2 transit_weight_minutes: 6 transit_weight_meters: 2347 saved_co2_kg: 0.31 is_preferred_slot: true position_in_interval: last examples: - data: - calendar_resource_ids: - 6372 from: '2024-07-16T08:00:00Z' to: '2024-07-16T09:00:00Z' full_address: 'Street 23, 1122 City' start_time_interval: from: '10:00' to: '12:20' label: 'Tidsrummet 10:00 - 12:20' idx_on_day: 0 transit_weight_minutes: 6 transit_weight_meters: 2347 saved_co2_kg: 0.31 is_preferred_slot: true position_in_interval: first - calendar_resource_ids: - 6372 from: '2024-07-16T10:30:00Z' to: '2024-07-16T11:30:00Z' full_address: 'Street 23, 1122 City' start_time_interval: from: '12:20' to: '14:40' label: 'Tidsrummet 12:20 - 14:40' idx_on_day: 1 transit_weight_minutes: 12 transit_weight_meters: 4694 saved_co2_kg: 0 is_preferred_slot: false position_in_interval: middle - calendar_resource_ids: - 6372 from: '2024-07-16T13:54:00Z' to: '2024-07-16T14:54:00Z' full_address: 'Street 23, 1122 City' start_time_interval: from: '14:40' to: '17:00' label: 'Tidsrummet 14:40 - 17:00' idx_on_day: 2 transit_weight_minutes: 6 transit_weight_meters: 2347 saved_co2_kg: 0.31 is_preferred_slot: true position_in_interval: last '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '422': description: 'Parameters rejected' content: application/json: schema: type: object properties: message: type: string examples: - 'Invalid address' errors: type: object properties: full_address: type: string examples: - 'Invalid address' examples: - message: 'Invalid address' errors: full_address: 'Invalid address' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Booking Forms' parameters: - in: path name: booking_form_id description: 'The ID of the booking form.' required: true schema: type: integer examples: - 6 '/calendar-resources/{calendar_resource_id}/is-busy': get: summary: 'Check availability' operationId: checkAvailability description: 'Check if a calendar resource is still available to be booked for a given time slot' parameters: - in: query name: from description: 'From date and time.' required: true schema: type: string description: 'From date and time.' examples: - '2024-03-01T09:00Z' - in: query name: to description: 'To date and time.' required: true schema: type: string description: 'To date and time.' examples: - '2024-03-01T10:30Z' - in: query name: full_address description: 'Full address for meeting. Must include street, number and postal code. Required only for booking forms with location activated' required: true schema: type: string description: 'Full address for meeting. Must include street, number and postal code. Required only for booking forms with location activated' examples: - 'Street 23, 1122 City' - in: query name: use_base_address_as_fallback description: "Treat the resource's base address as the location of any surrounding event that has no address of its own, when calculating travel time." required: false schema: type: boolean description: "Treat the resource's base address as the location of any surrounding event that has no address of its own, when calculating travel time." examples: - true responses: '200': description: 'Success response' content: application/json: schema: type: object properties: data: type: object properties: busy: type: boolean examples: - false required: - busy examples: - data: busy: false '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '422': description: 'Error response' content: application/json: schema: type: object properties: message: type: string examples: - 'Error message' error: type: object properties: parameter: type: string examples: - 'Error message' examples: - message: 'Error message' error: parameter: 'Error message' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Booking Forms' parameters: - in: path name: calendar_resource_id description: 'The ID of the calendar resource.' required: true schema: type: string examples: - consequatur /calendar-events: get: summary: 'List calendar events' operationId: listCalendarEvents description: 'Returns a paginated list of calendar events. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'This endpoint limits the maximum number of results per page to 100 (default: 25)' required: false schema: type: integer description: 'This endpoint limits the maximum number of results per page to 100 (default: 25)' examples: - 5 - in: query name: include description: 'Available relationships: `leads`, `leads.status`, `leads.assignee`, `leads.field_values`, `leads.select_field_values`, `calendar_resources`, `calendar_resources.user`, `calendar_services`, `booking`, `booking.booking_form`, `booking.lead`, `created_by_actor`' required: false schema: type: string description: 'Available relationships: `leads`, `leads.status`, `leads.assignee`, `leads.field_values`, `leads.select_field_values`, `calendar_resources`, `calendar_resources.user`, `calendar_services`, `booking`, `booking.booking_form`, `booking.lead`, `created_by_actor`' examples: default: value: 'leads,calendar_resources,calendar_services' x-disabled: false allowReserved: true - in: query name: sort description: "Available sort options: `id`, `start`, `end`, `created_at`, `updated_at`, `deleted_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `start`, `end`, `created_at`, `updated_at`, `deleted_at`\n\nDefault: `id`" examples: - '-updated_at' - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: 'filter[id]' description: 'Filter by calendar event id.' required: false schema: type: string description: 'Filter by calendar event id.' examples: - '1,2' - in: query name: 'filter[self]' description: "Filter calendar events using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `start`, `end`, `title`, `location`, `description`, `type`, `created_at`, `updated_at`, `deleted_at`, `all_day`, `allow_overlap`\n\n**Note** that filtering on the `title`, `location`, and `description` properties does not work if their value is dynamically set. For example, if they are using default values.\n\n**Also note** that filtering on the `type` property requires the `{value}` to be either `default` or `teams`.\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`type = teams, start >= today, start < tomorrow`\n\n`allow_overlap = false`" required: false schema: type: string description: "Filter calendar events using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `start`, `end`, `title`, `location`, `description`, `type`, `created_at`, `updated_at`, `deleted_at`, `all_day`, `allow_overlap`\n\n**Note** that filtering on the `title`, `location`, and `description` properties does not work if their value is dynamically set. For example, if they are using default values.\n\n**Also note** that filtering on the `type` property requires the `{value}` to be either `default` or `teams`.\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`type = teams, start >= today, start < tomorrow`\n\n`allow_overlap = false`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[calendar_resources]' description: "Filter calendar events by attending calendar resource using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `email`, `resource_group_id`, `resource_team_id`\n\nExample: `email = resource@email.com`" required: false schema: type: string description: "Filter calendar events by attending calendar resource using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `email`, `resource_group_id`, `resource_team_id`\n\nExample: `email = resource@email.com`" examples: - 'email = resource@email.com' - in: query name: 'filter[calendar_services]' description: "Filter calendar events by their calendar event type (service) using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `slug`\n\nExample: `slug IN type-1;type-2`" required: false schema: type: string description: "Filter calendar events by their calendar event type (service) using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `slug`\n\nExample: `slug IN type-1;type-2`" examples: - 'slug IN type-1;type-2' - in: query name: 'filter[leads]' description: "Filter calendar events by attending leads using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `campaign_id`, `status_id`, `assignee_id`, `created_at`, `updated_at`\n\nExample: `campaign_id = 1234`" required: false schema: type: string description: "Filter calendar events by attending leads using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `campaign_id`, `status_id`, `assignee_id`, `created_at`, `updated_at`\n\nExample: `campaign_id = 1234`" examples: - 'campaign_id = 1234' - in: query name: 'filter[booking]' description: "Filter calendar events by booking submission properties using [expression filters](#description/expression-filters).\n\nAvailable properties: `booking_form_id`, `booking_form_slug`, `lead_id`, `suggested_slot`, `ip`, `form_page_url`, `new_lead`, `created_at`\n\nExample: `booking_form_slug IN form-1;form-2, suggested_slot=true`" required: false schema: type: string description: "Filter calendar events by booking submission properties using [expression filters](#description/expression-filters).\n\nAvailable properties: `booking_form_id`, `booking_form_slug`, `lead_id`, `suggested_slot`, `ip`, `form_page_url`, `new_lead`, `created_at`\n\nExample: `booking_form_slug IN form-1;form-2, suggested_slot=true`" examples: - 'booking_form_slug IN form-1;form-2, suggested_slot=true' - in: query name: 'filter[created_after]' description: "Filter by calendar event's `created_at` timestamp. Short for `filter[{property}]=created_at >= value`" required: false schema: type: string description: "Filter by calendar event's `created_at` timestamp. Short for `filter[{property}]=created_at >= value`" examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: "Filter by calendar event's `updated_at` timestamp. Short for `filter[{property}]=updated_at >= value`" required: false schema: type: string description: "Filter by calendar event's `updated_at` timestamp. Short for `filter[{property}]=updated_at >= value`" examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[has:leads]' description: 'Filter by has-lead / has-no-lead.' required: false schema: type: boolean description: 'Filter by has-lead / has-no-lead.' examples: - true - in: query name: 'filter[has:calendar_services]' description: 'Filter by has-calendar-service / has-no-calendar-service.' required: false schema: type: boolean description: 'Filter by has-calendar-service / has-no-calendar-service.' examples: - true - in: query name: 'filter[has:booking]' description: 'Filter by whether event was created in booking form.' required: false schema: type: boolean description: 'Filter by whether event was created in booking form.' examples: - true responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/CalendarEvent' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 title: Consultation location: 'Office A' description: 'Discussion about the project' start: '2026-01-15T09:30:00.000000Z' end: '2026-01-15T09:30:00.000000Z' all_day: false private: false color: '#FF5733' type: meeting allow_overlap: true content_visibility: All calendar_services: - id: 1 name: Consultation slug: consultation service_field_values: {} calendar_resources: - id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' leads: - id: 1 campaign_id: 1 field_values: name: 'Jane Doe' email: jane@example.com phone: '+4512345678' select_field_values: select_type: name: Private slug: private status: id: 1 name: string slug: string set_by_user_id: 1 set_by_automation: true set_by_api: true set_at: '2026-01-15T09:30:00.000000Z' assignee: id: 1 user_id: 1 set_by_user_id: 1 set_by_automation: true set_at: '2026-01-15T09:30:00.000000Z' token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' booking: lead_id: 1 booking_form_id: 1 lead: id: 1 campaign_id: 1 token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' booking_form: id: 1 campaign_id: 101 name: 'Consultation Booking' slug: consultation-booking token: abc123token order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' suggested_slot: false ip: 127.0.0.1 form_page_url: 'https://example.com/booking' created_lead: true created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_by_actor: type: User created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/calendar-events?page=1' last: 'https://api.leadvalidator.dk/calendar-events?page=5' prev: null next: 'https://api.leadvalidator.dk/calendar-events?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/calendar-events' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Events' post: summary: 'Create calendar event' operationId: createCalendarEvent description: 'Create a new calendar event and optionally create related leads.' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/CalendarEvent' examples: default: value: id: 1 title: Consultation location: 'Office A' description: 'Discussion about the project' start: '2026-01-15T09:30:00.000000Z' end: '2026-01-15T09:30:00.000000Z' all_day: false private: false color: '#FF5733' type: meeting allow_overlap: true content_visibility: All calendar_services: - id: 1 name: Consultation slug: consultation service_field_values: {} calendar_resources: - id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' leads: - id: 1 campaign_id: 1 field_values: name: 'Jane Doe' email: jane@example.com phone: '+4512345678' select_field_values: select_type: name: Private slug: private status: id: 1 name: string slug: string set_by_user_id: 1 set_by_automation: true set_by_api: true set_at: '2026-01-15T09:30:00.000000Z' assignee: id: 1 user_id: 1 set_by_user_id: 1 set_by_automation: true set_at: '2026-01-15T09:30:00.000000Z' token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' booking: lead_id: 1 booking_form_id: 1 lead: id: 1 campaign_id: 1 token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' booking_form: id: 1 campaign_id: 101 name: 'Consultation Booking' slug: consultation-booking token: abc123token order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' suggested_slot: false ip: 127.0.0.1 form_page_url: 'https://example.com/booking' created_lead: true created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_by_actor: type: User created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '422': description: 'One or more input parameters are invalid.' content: application/json: schema: type: object properties: message: type: string examples: - 'The data was invalid.' errors: type: object properties: '{parameter}': type: array items: type: string examples: - - 'The {parameter} field is required.' examples: - message: 'The data was invalid.' errors: '{parameter}': - 'The {parameter} field is required.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Events' requestBody: required: true content: application/json: schema: type: object properties: title: type: string description: 'The title of the event. Must not be greater than 191 characters.' examples: - 'Meeting with the client' all_day: type: boolean description: 'Whether the event is an all-day event. If `true` start time will be set to 00:00 and end time to 23:59.' examples: - false start: type: string description: 'The start datetime of the event. If `all_day=true` time will be set to the start of the day.' examples: - '2023-01-22T13:30:00Z' end: type: string description: 'The end datetime of the event. If `all_day=true` time will be set to the end of the day (23:59:59).' examples: - '2023-01-22T14:30:00Z' location: type: string description: 'The full address of the event. Must not be greater than 191 characters.' examples: - 'Vesterbrogade 39, 1620 København V' description: type: string description: 'The description of the event.' examples: - 'The client needs to leave exactly one hour after the event starts.' type: type: string description: 'To create a new Microsoft Teams meeting, set this to "teams". The resource must have a Microsoft Calendar coupling in order to create a Teams meeting.' enum: - default - teams examples: - teams color: type: string description: 'The background color of the event in the calendar. Format: Hex' examples: - '#1ca9c9' allow_overlap: type: boolean description: 'Whether other events can be booked at the same time. Opposite of "is busy".' examples: - false content_visibility: type: string description: 'The visibility of the event content. Default is default.' enum: - default - all - attendants - none examples: - default private: type: boolean description: 'Whether the event is a private event.' examples: - false resource_ids: type: array description: 'The calendar resource IDs (meeting attendant).' items: type: integer examples: - - 6 calendar_services: type: array description: 'An array of calendar services (meeting types) attached to this event. Each calendar service is defined an array having either an `id` or `slug` key value, and, optionally, an array of `service_field_values`. This field is not allowed if private is true.' items: type: object properties: id: type: - integer - 'null' description: 'This field is required when calendar_services.*.slug is not present. Must match an existing stored value.' examples: - 6 slug: type: - string - 'null' description: 'This field is required when calendar_services.*.id is not present. Must match an existing stored value.' examples: - consequatur service_field_values: type: - object - 'null' description: '' properties: {} examples: - null examples: - - slug: sales-meeting service_field_values: {} lead_ids: type: array description: 'The Hubhus IDs of leads attending the event. This field is not allowed if private is true.' items: type: integer examples: - - 1234 leads: type: array description: 'An array of leads that will be created by the same request and linked to the calendar event.' items: type: object properties: campaign_id: type: integer description: '' examples: - 6 field_values: type: object description: 'An object of campaign fields as key-value pairs with the API name of the field as keys and the field-value as value. Dynamic keys like `%email%` can be used to target the first campaign field of that type. Available types: `%text%` (Default), `%name%` (Full name), `%first-name%` (First name), `%middle-name%` (Middle name), `%last-name%` (Last name), `%phone%` (Phone), `%email%` (Email), `%street-address%` (Street addr.), `%floor%` (Floor/Apartment/Subpremise), `%postal%` (Postal code), `%city-name%` (City name), `%full-address%` (Full address), `%country%` (Country), `%int%` (Number), `%currency-amount%` (Amount in currency), `%db-date%` (Date (strict)), `%db-time%` (Time of day (strict)), `%db-datetime%` (Date & time (strict)), `%db-birthdate%` (Date of birth (strict)), `%comment%` (Comment / Notes), , `%bool%` (Check), `%url%` (URL), `%ipv4%` (IP address), `%homepage%` (URL homepage), `%license-plate%` (License plate), `%vehicle-vin%` (Vehicle ID), `%cvr%` (CVR), `%company-name%` (Company name). Note: `%full-address%` and `%name%` may be split into separate constituent fields if no direct match is found. Similarly, passing `%street-address%`, `%postal%` and `%city-name%` may be merged into one full-address field if not direct field matches are found. Similarly, passing `%first-name%`, `%middle-name%` and `%last-name%` may be merged into a full name field.' properties: {} examples: - {} select_field_values: type: object description: 'An object of campaign select fields as key-value pairs with the select field API name as key and the select field option API name as value.' properties: {} examples: - {} status_id: type: integer description: 'The current status ID of the created lead. Specify either `status_id` OR `status_slug` - not both.' examples: - 6 status_slug: type: string description: 'The current status slug of the created lead. Specify either `status_id` OR `status_slug` - not both.' examples: - won assignee_id: type: integer description: 'The current assignee ID of the created lead. Specify either `assignee_id` OR `assignee_email` - not both.' examples: - 6 assignee_email: type: string description: 'The email of the current assignee of the created lead. Specify either `assignee_id` OR `assignee_email` - not both.' examples: - user@example.com utm_codes: type: object description: '' properties: utm_medium: type: - string - 'null' description: '' examples: - consequatur utm_source: type: - string - 'null' description: '' examples: - consequatur utm_campaign: type: - string - 'null' description: '' examples: - consequatur utm_content: type: - string - 'null' description: '' examples: - consequatur utm_term: type: - string - 'null' description: '' examples: - consequatur examples: - {} parent_lead_ids: type: array description: 'An array of existing, parent lead IDs (Hubhus IDs) that the lead is related to. A campaign relation must exist between the two campaigns.' items: type: integer examples: - - 123 child_lead_ids: type: array description: 'An array of existing, child lead IDs (Hubhus IDs) that the lead is related to. A campaign relation must exist between the two campaigns.' items: type: integer examples: - - 123 comments: type: array description: 'An array of internal comments added to the created lead.' items: type: string examples: - - 'Comment 1' - 'Comment 2' calendar_event_ids: type: array description: 'An array of existing calendar event IDs (Hubhus IDs) that the lead attends.' items: type: integer examples: - - 123 - 422 data_field_values: type: object description: 'An object of data field values as key-value pairs with the data field API name as key.' properties: {} examples: - {} consents: type: array description: 'An array of consents that the lead has given.' items: type: object properties: consent_declaration_id: type: string description: 'The UUID of the consent declaration.' examples: - 123e4567-e89b-12d3-a456-426614174000 identifier: type: string description: 'The unique identifier of the consent.' examples: - email@example.com consented_at: type: string description: 'The date and time the consent was given.' examples: - '2024-01-01 12:00:00' source: type: string description: 'The source of the consent.' examples: - 'web form' required: - consent_declaration_id - identifier examples: - - consent_declaration_id: 434f3dd4-b9c5-4777-b993-779ff21c524c consented_at: '2024-01-01 12:00:00' identifier: name@example.com required: - campaign_id examples: - - campaign_id: 123 required: - start - end - resource_ids '/calendar-events/{id}': get: summary: 'Show calendar event' operationId: showCalendarEvent description: 'Returns a single calendar event. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `leads`, `leads.status`, `leads.assignee`, `leads.field_values`, `leads.select_field_values`, `calendar_resources`, `calendar_resources.user`, `calendar_services`, `booking`, `booking.booking_form`, `booking.lead`, `created_by_actor`' required: false schema: type: string description: 'Available relationships: `leads`, `leads.status`, `leads.assignee`, `leads.field_values`, `leads.select_field_values`, `calendar_resources`, `calendar_resources.user`, `calendar_services`, `booking`, `booking.booking_form`, `booking.lead`, `created_by_actor`' examples: default: value: 'leads.status,leads.field_values,calendar_resources.user' x-disabled: false allowReserved: true - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/CalendarEvent' examples: default: value: id: 1 title: Consultation location: 'Office A' description: 'Discussion about the project' start: '2026-01-15T09:30:00.000000Z' end: '2026-01-15T09:30:00.000000Z' all_day: false private: false color: '#FF5733' type: meeting allow_overlap: true content_visibility: All calendar_services: - id: 1 name: Consultation slug: consultation service_field_values: {} calendar_resources: - id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' leads: - id: 1 campaign_id: 1 field_values: name: 'Jane Doe' email: jane@example.com phone: '+4512345678' select_field_values: select_type: name: Private slug: private status: id: 1 name: string slug: string set_by_user_id: 1 set_by_automation: true set_by_api: true set_at: '2026-01-15T09:30:00.000000Z' assignee: id: 1 user_id: 1 set_by_user_id: 1 set_by_automation: true set_at: '2026-01-15T09:30:00.000000Z' token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' booking: lead_id: 1 booking_form_id: 1 lead: id: 1 campaign_id: 1 token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' booking_form: id: 1 campaign_id: 101 name: 'Consultation Booking' slug: consultation-booking token: abc123token order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' suggested_slot: false ip: 127.0.0.1 form_page_url: 'https://example.com/booking' created_lead: true created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_by_actor: type: User created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Events' patch: summary: 'Update calendar event' operationId: updateCalendarEvent description: 'Omitted properties are left untouched.' responses: '204': description: 'Successfully updated.' content: application/json: schema: type: - object - 'null' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '422': description: 'One or more input parameters are invalid.' content: application/json: schema: type: object properties: message: type: string examples: - 'The data was invalid.' errors: type: object properties: '{parameter}': type: array items: type: string examples: - - 'The {parameter} field is required.' examples: - message: 'The data was invalid.' errors: '{parameter}': - 'The {parameter} field is required.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Events' requestBody: required: false content: application/json: schema: type: object properties: title: type: string description: 'The title of the event. Must not be greater than 191 characters.' examples: - 'Meeting with the client' all_day: type: boolean description: 'Whether the event is an all-day event. If `true` start time will be set to 00:00 and end time to 23:59.' examples: - false start: type: string description: 'The start datetime of the event. If `all_day=true` time will be set to the start of the day.' examples: - '2023-01-22T13:30:00Z' end: type: string description: 'The end datetime of the event. If `all_day=true` time will be set to the end of the day (23:59:59).' examples: - '2023-01-22T14:30:00Z' location: type: string description: 'The full address of the event. Must not be greater than 191 characters.' examples: - 'Vesterbrogade 39, 1620 København V' description: type: string description: 'The description of the event.' examples: - 'The client needs to leave exactly one hour after the event starts.' color: type: string description: 'The background color of the event in the calendar. Format: Hex' examples: - '#1ca9c9' allow_overlap: type: boolean description: 'Whether other events can be booked at the same time. Opposite of "is busy".' examples: - false content_visibility: type: string description: 'The visibility of the event content. Default is default.' enum: - default - all - attendants - none examples: - default private: type: boolean description: 'Whether the event is a private event.' examples: - false resource_ids: type: array description: 'The calendar resource IDs (meeting attendant).' items: type: integer examples: - - 6 calendar_services: type: array description: 'An array of calendar services (meeting types) attached to this event. Each calendar service is defined an array having either an `id` or `slug` key value, and, optionally, an array of `service_field_values`. This field is not allowed if private is true.' items: type: object properties: id: type: - integer - 'null' description: 'This field is required when calendar_services.*.slug is not present. Must match an existing stored value.' examples: - 6 slug: type: - string - 'null' description: 'This field is required when calendar_services.*.id is not present. Must match an existing stored value.' examples: - consequatur service_field_values: type: - object - 'null' description: '' properties: {} examples: - null examples: - - slug: sales-meeting service_field_values: {} lead_ids: type: array description: 'The Hubhus IDs of existing leads attending the event. This field is not allowed if private is true. Existing, related `lead_ids` not included in the array will be decoupled from the calendar-event. Pass an empty array to decouple all leads.' items: type: integer examples: - - 1234 type: type: string description: 'To create a new Microsoft Teams meeting, set this to "teams". The resource must have a Microsoft Calendar coupling in order to create a Teams meeting.' enum: - default - teams examples: - teams delete: summary: 'Delete calendar event' operationId: deleteCalendarEvent description: '' responses: '204': description: 'Successfully deleted.' content: application/json: schema: type: - object - 'null' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Events' parameters: - in: path name: id description: 'The ID of the calendar event.' required: true schema: type: integer examples: - 6 /calendar-resource-groups: get: summary: 'List calendar resource groups' operationId: listCalendarResourceGroups description: 'Returns a paginated list of calendar resource groups. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: include description: 'Available relationships: `calendar_resources`, `calendar_resources.user`' required: false schema: type: string description: 'Available relationships: `calendar_resources`, `calendar_resources.user`' examples: default: value: calendar_resources x-disabled: false allowReserved: true - in: query name: sort description: "Available sort options: `id`, `name`, `created_at`, `updated_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `name`, `created_at`, `updated_at`\n\nDefault: `id`" examples: - '-updated_at' - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: 'filter[id]' description: 'Filter by calendar resource group id.' required: false schema: type: string description: 'Filter by calendar resource group id.' examples: - '1,2' - in: query name: 'filter[self]' description: "Filter calendar resource group using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `created_at`, `updated_at`\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`name = Resource Tag Name`" required: false schema: type: string description: "Filter calendar resource group using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `created_at`, `updated_at`\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`name = Resource Tag Name`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[has:calendar_resources]' description: 'Filter by has-resources / has-no-resources.' required: false schema: type: boolean description: 'Filter by has-resources / has-no-resources.' examples: - true - in: query name: 'filter[created_after]' description: 'Filter by created timestamp.' required: false schema: type: string description: 'Filter by created timestamp.' examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: 'Filter by updated timestamp.' required: false schema: type: string description: 'Filter by updated timestamp.' examples: - '2026-01-15T08:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/CalendarResourceGroup' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 name: 'Service Group' order_weight: 1 calendar_resources: - id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/calendar-resource-groups?page=1' last: 'https://api.leadvalidator.dk/calendar-resource-groups?page=5' prev: null next: 'https://api.leadvalidator.dk/calendar-resource-groups?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/calendar-resource-groups' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Resource Groups' '/calendar-resource-groups/{id}': get: summary: 'Show calendar resource group' operationId: showCalendarResourceGroup description: 'Returns a single calendar resource group. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `calendar_resources`, `calendar_resources.user`' required: false schema: type: string description: 'Available relationships: `calendar_resources`, `calendar_resources.user`' examples: default: value: calendar_resources x-disabled: false allowReserved: true responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/CalendarResourceGroup' examples: default: value: id: 1 name: 'Service Group' order_weight: 1 calendar_resources: - id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Resource Groups' parameters: - in: path name: id description: 'The ID of the calendar resource group.' required: true schema: type: integer examples: - 6 /calendar-resource-teams: get: summary: 'List calendar resource teams' operationId: listCalendarResourceTeams description: 'Returns a paginated list of calendar resource teams. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: include description: 'Available relationships: `calendar_resources`, `calendar_resources.user`' required: false schema: type: string description: 'Available relationships: `calendar_resources`, `calendar_resources.user`' examples: default: value: calendar_resources.user x-disabled: false allowReserved: true - in: query name: sort description: "Available sort options: `id`, `name`, `order_weight`, `created_at`, `updated_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `name`, `order_weight`, `created_at`, `updated_at`\n\nDefault: `id`" examples: - '-updated_at' - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: 'filter[id]' description: 'Filter by calendar resource team id.' required: false schema: type: string description: 'Filter by calendar resource team id.' examples: - '1,2' - in: query name: 'filter[self]' description: "Filter calendar resource team using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `created_at`, `updated_at`\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`name = TestTeam`" required: false schema: type: string description: "Filter calendar resource team using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `created_at`, `updated_at`\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`name = TestTeam`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[has:calendar_resources]' description: 'Filter by has-calendar_resources / has-no-calendar_resources.' required: false schema: type: boolean description: 'Filter by has-calendar_resources / has-no-calendar_resources.' examples: - true - in: query name: 'filter[created_after]' description: 'Filter by created timestamp.' required: false schema: type: string description: 'Filter by created timestamp.' examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: 'Filter by updated timestamp.' required: false schema: type: string description: 'Filter by updated timestamp.' examples: - '2026-01-15T08:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/CalendarResourceTeam' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 name: 'Sales Team' order_weight: 1 calendar_resources: - id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/calendar-resource-teams?page=1' last: 'https://api.leadvalidator.dk/calendar-resource-teams?page=5' prev: null next: 'https://api.leadvalidator.dk/calendar-resource-teams?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/calendar-resource-teams' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Resource Teams' '/calendar-resource-teams/{id}': get: summary: 'Show calendar resource team' operationId: showCalendarResourceTeam description: 'Returns a single calendar resource team. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `calendar_resources`, `calendar_resources.user`' required: false schema: type: string description: 'Available relationships: `calendar_resources`, `calendar_resources.user`' examples: default: value: calendar_resources.user x-disabled: false allowReserved: true responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/CalendarResourceTeam' examples: default: value: id: 1 name: 'Sales Team' order_weight: 1 calendar_resources: - id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Resource Teams' parameters: - in: path name: id description: 'The ID of the calendar resource team.' required: true schema: type: integer examples: - 6 /calendar-resources: get: summary: 'List calendar resources' operationId: listCalendarResources description: 'Returns a paginated list of calendar resources. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: include description: 'Available relationships: `user`, `base_location`, `business_hours`, `special_dates`, `resource_team`, `resource_groups`' required: false schema: type: string description: 'Available relationships: `user`, `base_location`, `business_hours`, `special_dates`, `resource_team`, `resource_groups`' examples: default: value: 'user,base_location' x-disabled: false allowReserved: true - in: query name: sort description: "Available sort options: `id`, `type`, `active`, `order_weight`, `created_at`, `updated_at`\n\nDefault: `-active,type,order_weight,id`" required: false schema: type: string description: "Available sort options: `id`, `type`, `active`, `order_weight`, `created_at`, `updated_at`\n\nDefault: `-active,type,order_weight,id`" examples: - '-updated_at' - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: 'filter[id]' description: 'Filter by calendar resource id.' required: false schema: type: string description: 'Filter by calendar resource id.' examples: - '1,2' - in: query name: 'filter[active]' description: "Filter by active state.\n\nAvailable options: `0`, `1`" required: false schema: type: boolean description: "Filter by active state.\n\nAvailable options: `0`, `1`" examples: - true - in: query name: 'filter[self]' description: "Filter calendar resources by various properties using [expression filters](#description/expression-filters)..\n\nAvailable properties: `id`, `name`, `email`, `type`, `user_id`, `base_address`, `created_at`, `updated_at`, `type`\n\n**Note** that the value of `{type}` must be either `user` or `other`.\n\nExamples:\n\n`updated_at >= 2022-01-01`\n\n`email = user@example.com`" required: false schema: type: string description: "Filter calendar resources by various properties using [expression filters](#description/expression-filters)..\n\nAvailable properties: `id`, `name`, `email`, `type`, `user_id`, `base_address`, `created_at`, `updated_at`, `type`\n\n**Note** that the value of `{type}` must be either `user` or `other`.\n\nExamples:\n\n`updated_at >= 2022-01-01`\n\n`email = user@example.com`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[resource_groups]' description: "Filter calendar resources by resource group (tag) using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`\n\nExamples:\n\n`id = 1234`" required: false schema: type: string description: "Filter calendar resources by resource group (tag) using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`\n\nExamples:\n\n`id = 1234`" examples: - 'id = 1234' - in: query name: 'filter[resource_team]' description: "Filter calendar resources by resource team using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`\n\nExamples:\n\n`id = 1234`" required: false schema: type: string description: "Filter calendar resources by resource team using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`\n\nExamples:\n\n`id = 1234`" examples: - 'id = 1234' - in: query name: 'filter[created_after]' description: 'Filter by created timestamp.' required: false schema: type: string description: 'Filter by created timestamp.' examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: 'Filter by updated timestamp.' required: false schema: type: string description: 'Filter by updated timestamp.' examples: - '2026-01-15T08:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/CalendarResource' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 base_location: base_address: string base_address_after: string operable_postal_codes: - string resource_team: id: 1 name: 'Sales Team' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' resource_groups: - id: 1 name: 'Service Group' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' special_dates: - date_from: '2026-09-04' date_to: '2026-09-05' base_location: 'Office A' operable_postal_codes: - string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' business_hours: - days_of_week: '1,2,3' start_time: '09:00' end_time: '17:00' weeks: 'Even weeks' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/calendar-resources?page=1' last: 'https://api.leadvalidator.dk/calendar-resources?page=5' prev: null next: 'https://api.leadvalidator.dk/calendar-resources?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/calendar-resources' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Resources' post: summary: 'Create calendar resource' operationId: createCalendarResource description: '' responses: '201': description: 'Successfully created.' content: application/json: schema: $ref: '#/components/schemas/CalendarResource' examples: default: value: id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 base_location: base_address: string base_address_after: string operable_postal_codes: - string resource_team: id: 1 name: 'Sales Team' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' resource_groups: - id: 1 name: 'Service Group' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' special_dates: - date_from: '2026-09-04' date_to: '2026-09-05' base_location: 'Office A' operable_postal_codes: - string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' business_hours: - days_of_week: '1,2,3' start_time: '09:00' end_time: '17:00' weeks: 'Even weeks' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '422': description: 'One or more input parameters are invalid.' content: application/json: schema: type: object properties: message: type: string examples: - 'The data was invalid.' errors: type: object properties: '{parameter}': type: array items: type: string examples: - - 'The {parameter} field is required.' examples: - message: 'The data was invalid.' errors: '{parameter}': - 'The {parameter} field is required.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Resources' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: 'Either `User` for a calendar belonging to a user, or `Other` for a standalone calendar such as a vehicle or a meeting room.' examples: - Other user_id: type: integer description: 'The user the calendar belongs to. Required when `type` is `User`, and not allowed otherwise. A user can only have one calendar resource.' examples: - 6 name: type: string description: 'Name of the calendar, unique within the account. Required when `type` is `Other`, and not allowed otherwise, since user calendars are named after their user.' examples: - 'Van 1' background_color: type: string description: "Calendar background colour as hex (`#80afff`), `rgb()` or `rgba()`. Send `null` to fall back to the colour inherited from the user's user tags or the account default. Note that the colour is returned as `rgba()` and is rendered with an opacity of 0.5." examples: - '#80afff' duration_factor: type: string description: 'Multiplication factor in percent applied to event durations for this calendar, as a string. `"100"` leaves durations unchanged, `"150"` makes them 50% longer. Placeholders are allowed as long as they resolve to a number. Send `null` to remove the factor.' examples: - '100' resource_team_id: type: integer description: 'ID of the calendar resource team the calendar belongs to. Send `null` to remove it from its team.' examples: - 6 resource_group_ids: type: array description: "IDs of the calendar resource groups to attach the calendar to. Note that the `resource_groups` relationship returned by `GET` also lists groups inherited from the user's user tags; only directly attached groups can be written." items: type: integer examples: - - 6 base_location: type: object description: "The calendar's geographical base, used for route planning and booking availability. Omitted keys are left untouched." properties: base_address: type: string description: 'Address the resource starts its day from. Must be an address that can be located on a map.' examples: - 'Vesterbrogade 39, 1620 København V' base_address_after: type: string description: 'Address the resource returns to, when it differs from the starting address. Must be an address that can be located on a map.' examples: - consequatur operable_postal_codes: type: array description: 'Postal codes and ranges the resource can service, each prefixed with a country code, e.g. `DK-8000` or `DK-8000-8299`. Replaces the current list; pass an empty array to clear it.' items: type: string examples: - - DK-8000 - DK-8200 examples: - {} required: - type '/calendar-resources/{id}': get: summary: 'Show calendar resource' operationId: showCalendarResource description: 'Returns a single calendar resource. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `user`, `base_location`, `business_hours`, `special_dates`, `resource_team`, `resource_groups`' required: false schema: type: string description: 'Available relationships: `user`, `base_location`, `business_hours`, `special_dates`, `resource_team`, `resource_groups`' examples: default: value: 'user,base_location,business_hours' x-disabled: false allowReserved: true - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/CalendarResource' examples: default: value: id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 base_location: base_address: string base_address_after: string operable_postal_codes: - string resource_team: id: 1 name: 'Sales Team' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' resource_groups: - id: 1 name: 'Service Group' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' special_dates: - date_from: '2026-09-04' date_to: '2026-09-05' base_location: 'Office A' operable_postal_codes: - string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' business_hours: - days_of_week: '1,2,3' start_time: '09:00' end_time: '17:00' weeks: 'Even weeks' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Resources' patch: summary: 'Update calendar resource' operationId: updateCalendarResource description: 'Omitted properties are left untouched.' responses: '204': description: 'Successfully updated.' content: application/json: schema: type: - object - 'null' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '422': description: 'One or more input parameters are invalid.' content: application/json: schema: type: object properties: message: type: string examples: - 'The data was invalid.' errors: type: object properties: '{parameter}': type: array items: type: string examples: - - 'The {parameter} field is required.' examples: - message: 'The data was invalid.' errors: '{parameter}': - 'The {parameter} field is required.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Resources' requestBody: required: false content: application/json: schema: type: object properties: active: type: boolean description: 'Whether the calendar is in use. Setting it to `false` is rejected while the calendar has future calendar events with a lead attached; handle those first.' examples: - true background_color: type: string description: "Calendar background colour as hex (`#80afff`), `rgb()` or `rgba()`. Send `null` to fall back to the colour inherited from the user's user tags or the account default. Note that the colour is returned as `rgba()` and is rendered with an opacity of 0.5." examples: - '#80afff' duration_factor: type: string description: 'Multiplication factor in percent applied to event durations for this calendar, as a string. `"100"` leaves durations unchanged, `"150"` makes them 50% longer. Placeholders are allowed as long as they resolve to a number. Send `null` to remove the factor.' examples: - '100' resource_team_id: type: integer description: 'ID of the calendar resource team the calendar belongs to. Send `null` to remove it from its team.' examples: - 6 resource_group_ids: type: array description: "IDs of the calendar resource groups the calendar should belong to. This replaces the current groups; pass an empty array to detach all of them. Note that the `resource_groups` relationship returned by `GET` also lists groups inherited from the user's user tags; only directly attached groups can be written." items: type: integer examples: - - 6 base_location: type: object description: "The calendar's geographical base, used for route planning and booking availability. Omitted keys are left untouched." properties: base_address: type: string description: 'Address the resource starts its day from. Must be an address that can be located on a map.' examples: - 'Vesterbrogade 39, 1620 København V' base_address_after: type: string description: 'Address the resource returns to, when it differs from the starting address. Must be an address that can be located on a map.' examples: - consequatur operable_postal_codes: type: array description: 'Postal codes and ranges the resource can service, each prefixed with a country code, e.g. `DK-8000` or `DK-8000-8299`. Replaces the current list; pass an empty array to clear it.' items: type: string examples: - - DK-8000 - DK-8200 examples: - {} name: type: string description: 'Name of the calendar, unique within the account. Only writable on calendars whose `type` is `Other`; user calendars are named after their user.' examples: - consequatur parameters: - in: path name: id description: 'The ID of the calendar resource.' required: true schema: type: integer examples: - 6 /calendar-services: get: summary: 'List calendar services' operationId: listCalendarServices description: 'Returns a paginated list of calendar services. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: include description: 'Available relationships: `fields`, `campaigns`' required: false schema: type: string description: 'Available relationships: `fields`, `campaigns`' examples: default: value: 'fields,campaigns' x-disabled: false allowReserved: true - in: query name: sort description: "Available sort options: `id`, `name`, `order_weight`, `created_at`, `updated_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `name`, `order_weight`, `created_at`, `updated_at`\n\nDefault: `id`" examples: - '-updated_at' - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: 'filter[id]' description: 'Filter by calendar service id.' required: false schema: type: string description: 'Filter by calendar service id.' examples: - '1,2' - in: query name: 'filter[self]' description: "Filter calendar services using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `slug`, `default_duration`, `all_day`, `order_weight`, `created_at`, `updated_at`\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`name = Service`" required: false schema: type: string description: "Filter calendar services using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `slug`, `default_duration`, `all_day`, `order_weight`, `created_at`, `updated_at`\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`name = Service`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[has:resources_types]' description: 'Filter by has-resources_types / has-no-resources_types with resources.' required: false schema: type: boolean description: 'Filter by has-resources_types / has-no-resources_types with resources.' examples: - true - in: query name: 'filter[has:fields]' description: 'Filter by has-fields / has-no-fields.' required: false schema: type: boolean description: 'Filter by has-fields / has-no-fields.' examples: - true - in: query name: 'filter[has:campaigns]' description: 'Filter by has-campaigns / has-no-campaigns.' required: false schema: type: boolean description: 'Filter by has-campaigns / has-no-campaigns.' examples: - true - in: query name: 'filter[created_after]' description: 'Filter by created timestamp.' required: false schema: type: string description: 'Filter by created timestamp.' examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: 'Filter by updated timestamp.' required: false schema: type: string description: 'Filter by updated timestamp.' examples: - '2026-01-15T08:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/CalendarService' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 name: Consultation slug: consultation color: '#FF5733' icon_clz: fa-calendar default_duration: 60 all_day: false order_weight: 10 fields: - id: 1 name: 'Bags used' slug: bags-used icon_clz: fa-home is_pii: false order_weight: 1 is_required: false is_multi_select: false options: - string default_value: 000-000-0000 campaigns: - id: 101 name: Leads campaign_group_id: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/calendar-services?page=1' last: 'https://api.leadvalidator.dk/calendar-services?page=5' prev: null next: 'https://api.leadvalidator.dk/calendar-services?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/calendar-services' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Services' '/calendar-services/{id}': get: summary: 'Show calendar service' operationId: showCalendarService description: 'Returns a single calendar service. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `fields`, `campaigns`' required: false schema: type: string description: 'Available relationships: `fields`, `campaigns`' examples: default: value: 'fields,campaigns' x-disabled: false allowReserved: true responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/CalendarService' examples: default: value: id: 1 name: Consultation slug: consultation color: '#FF5733' icon_clz: fa-calendar default_duration: 60 all_day: false order_weight: 10 fields: - id: 1 name: 'Bags used' slug: bags-used icon_clz: fa-home is_pii: false order_weight: 1 is_required: false is_multi_select: false options: - string default_value: 000-000-0000 campaigns: - id: 101 name: Leads campaign_group_id: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Calendar Services' parameters: - in: path name: id description: 'The ID of the calendar service.' required: true schema: type: integer examples: - 6 /campaigns: get: summary: 'List campaigns' operationId: listCampaigns description: 'Returns a paginated list of campaigns. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: include description: "Available relationships: `campaign_group`, `statuses`, `fields`, `fields.field_rules`, `assignees`, `assignees.user`, `select_fields`, `select_fields.options`,\n`enrichment_fields`, `file_fields`, `data_fields`, `nps_surveys`, `booking_forms`, `entity_name`, `parent_campaigns`, `child_campaigns`" required: false schema: type: string description: "Available relationships: `campaign_group`, `statuses`, `fields`, `fields.field_rules`, `assignees`, `assignees.user`, `select_fields`, `select_fields.options`,\n`enrichment_fields`, `file_fields`, `data_fields`, `nps_surveys`, `booking_forms`, `entity_name`, `parent_campaigns`, `child_campaigns`" examples: default: value: 'campaign_group,statuses,fields,select_fields,data_fields,booking_forms,parent_campaigns,child_campaigns' x-disabled: false allowReserved: true - in: query name: sort description: "Available sort options: `id`, `name`, `order_weight`, `created_at`, `updated_at`\n\nDefault: `campaign_group_id,order_weight,id`" required: false schema: type: string description: "Available sort options: `id`, `name`, `order_weight`, `created_at`, `updated_at`\n\nDefault: `campaign_group_id,order_weight,id`" examples: - name - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: 'filter[id]' description: 'Filter by campaign id.' required: false schema: type: string description: 'Filter by campaign id.' examples: - '1,2' - in: query name: 'filter[self]' description: "Filter campaigns by various properties using [expression filters](#description/expression-filters)..\n\nAvailable properties: `id`, `name`, `campaign_group_id`, `created_at`, `updated_at`\n\nExamples:\n\n`updated_at >= now -1 month`\n\n`campaign_group_id = 1234`" required: false schema: type: string description: "Filter campaigns by various properties using [expression filters](#description/expression-filters)..\n\nAvailable properties: `id`, `name`, `campaign_group_id`, `created_at`, `updated_at`\n\nExamples:\n\n`updated_at >= now -1 month`\n\n`campaign_group_id = 1234`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[has:parent_campaigns]' description: 'Filter by has related parent campaigns' required: false schema: type: boolean description: 'Filter by has related parent campaigns' examples: - true - in: query name: 'filter[has:child_campaigns]' description: 'Filter by has related child campaigns' required: false schema: type: boolean description: 'Filter by has related child campaigns' examples: - true - in: query name: 'filter[created_after]' description: 'Filter by created timestamp.' required: false schema: type: string description: 'Filter by created timestamp.' examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: 'Filter by created timestamp.' required: false schema: type: string description: 'Filter by created timestamp.' examples: - '2026-01-15T08:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Campaign' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 101 name: Leads campaign_group_id: 1 campaign_group: id: 1 name: Sales order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' fields: - id: 1 campaign_id: 101 name: 'Customer Phone' slug: customer-phone is_pii: true field_type: phone data_format: Any field_rules: - slug: required title: Required params: min: 1 max: 255 rejection_msg: 'This field is required' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' select_fields: - id: 1 campaign_id: 101 name: 'Lead Source' slug: lead-source order_weight: 1 options: - id: 1 select_field_id: 1 name: 'Home page' slug: home-page color: '#34D399' is_deactivated: false created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' enrichment_fields: - id: 1 campaign_id: 101 name: 'Company Name' slug: company-name active: true field_type: text order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' file_fields: - id: 1 campaign_id: 101 name: 'File Upload' slug: file-upload order_weight: 1 file_types: - IMAGE created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' data_fields: - id: 1 uuid: 550e8400-e29b-41d4-a716-446655440000 campaign_id: 101 name: 'Data Field' slug: data-field schema: $schema: 'https://json-schema.org/draft/2020-12/schema' type: object title: 'Contact details' properties: name: type: string title: Name minLength: 1 email: type: string title: Email format: email required: - name additionalProperties: false icon: 'fa fa-database' handler: default api_requirement: 1 lead_form_requirement: 1 lead_form_visibility: 1 lead_page_visibility: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' statuses: - id: 1 campaign_id: 101 name: Unhandled slug: unhandled color: '#FF5733' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' assignees: - id: 1 user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' nps_surveys: - id: 1 name: 'Customer NPS' title: 'How likely are you to recommend us?' token: abc123token active: true order_weight: 1 question: 'How likely are you to recommend us?' lang: en product_name: 'Acme Corp' is_custom_question: true created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' booking_forms: - id: 1 campaign_id: 101 name: 'Consultation Booking' slug: consultation-booking token: abc123token order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' parent_campaigns: - id: 101 name: Leads campaign_group_id: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' child_campaigns: - id: 101 name: Leads campaign_group_id: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' consent_declarations: - id: 550e8400-e29b-41d4-a716-446655440000 name: 'Privacy Policy' description: 'Privacy policy description' url: 'https://example.com/privacy' consent_setting: placeholders: {} mandatory: false created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' entity_name: singular: Lead plural: Leads links: first: 'https://api.leadvalidator.dk/campaigns?page=1' last: 'https://api.leadvalidator.dk/campaigns?page=5' prev: null next: 'https://api.leadvalidator.dk/campaigns?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/campaigns' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Campaigns '/campaigns/{id}': get: summary: 'Show campaign' operationId: showCampaign description: 'Returns a single campaign. Use `include` to include related resources.' parameters: - in: query name: include description: "Available relationships: `campaign_group`, `statuses`, `fields`, `fields.field_rules`, `assignees`, `assignees.user`, `select_fields`, `select_fields.options`,\n`enrichment_fields`, `file_fields`, `data_fields`, `nps_surveys`, `booking_forms`, `entity_name`, `parent_campaigns`, `child_campaigns`" required: false schema: type: string description: "Available relationships: `campaign_group`, `statuses`, `fields`, `fields.field_rules`, `assignees`, `assignees.user`, `select_fields`, `select_fields.options`,\n`enrichment_fields`, `file_fields`, `data_fields`, `nps_surveys`, `booking_forms`, `entity_name`, `parent_campaigns`, `child_campaigns`" examples: default: value: 'campaign_group,statuses,fields,select_fields,data_fields,booking_forms,parent_campaigns,child_campaigns' x-disabled: false allowReserved: true - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/Campaign' examples: default: value: id: 101 name: Leads campaign_group_id: 1 campaign_group: id: 1 name: Sales order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' fields: - id: 1 campaign_id: 101 name: 'Customer Phone' slug: customer-phone is_pii: true field_type: phone data_format: Any field_rules: - slug: required title: Required params: min: 1 max: 255 rejection_msg: 'This field is required' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' select_fields: - id: 1 campaign_id: 101 name: 'Lead Source' slug: lead-source order_weight: 1 options: - id: 1 select_field_id: 1 name: 'Home page' slug: home-page color: '#34D399' is_deactivated: false created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' enrichment_fields: - id: 1 campaign_id: 101 name: 'Company Name' slug: company-name active: true field_type: text order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' file_fields: - id: 1 campaign_id: 101 name: 'File Upload' slug: file-upload order_weight: 1 file_types: - IMAGE created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' data_fields: - id: 1 uuid: 550e8400-e29b-41d4-a716-446655440000 campaign_id: 101 name: 'Data Field' slug: data-field schema: $schema: 'https://json-schema.org/draft/2020-12/schema' type: object title: 'Contact details' properties: name: type: string title: Name minLength: 1 email: type: string title: Email format: email required: - name additionalProperties: false icon: 'fa fa-database' handler: default api_requirement: 1 lead_form_requirement: 1 lead_form_visibility: 1 lead_page_visibility: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' statuses: - id: 1 campaign_id: 101 name: Unhandled slug: unhandled color: '#FF5733' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' assignees: - id: 1 user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' nps_surveys: - id: 1 name: 'Customer NPS' title: 'How likely are you to recommend us?' token: abc123token active: true order_weight: 1 question: 'How likely are you to recommend us?' lang: en product_name: 'Acme Corp' is_custom_question: true created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' booking_forms: - id: 1 campaign_id: 101 name: 'Consultation Booking' slug: consultation-booking token: abc123token order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' parent_campaigns: - id: 101 name: Leads campaign_group_id: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' child_campaigns: - id: 101 name: Leads campaign_group_id: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' consent_declarations: - id: 550e8400-e29b-41d4-a716-446655440000 name: 'Privacy Policy' description: 'Privacy policy description' url: 'https://example.com/privacy' consent_setting: placeholders: {} mandatory: false created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' entity_name: singular: Lead plural: Leads '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Campaigns parameters: - in: path name: id description: 'The ID of the campaign.' required: true schema: type: integer examples: - 6 /consent-declarations: get: summary: 'List consent declarations' operationId: listConsentDeclarations description: 'Returns a paginated list of consent declarations. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: include description: 'Available relationships: `campaigns`, `consents_count`' required: false schema: type: string description: 'Available relationships: `campaigns`, `consents_count`' examples: default: value: 'campaigns,consents_count' x-disabled: false allowReserved: true - in: query name: 'filter[self]' description: "Filter vehicles by various vehicle properties using [expression filters](#description/expression-filters)..\n\nAvailable properties: `id`, `name`, `description`, `created_at`, `updated_at`\n\nExample: `created_at >= 2022-01-01, created_at < 2023-01-01`" required: false schema: type: string description: "Filter vehicles by various vehicle properties using [expression filters](#description/expression-filters)..\n\nAvailable properties: `id`, `name`, `description`, `created_at`, `updated_at`\n\nExample: `created_at >= 2022-01-01, created_at < 2023-01-01`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[has:campaigns]' description: 'Filter by has campaigns' required: false schema: type: boolean description: 'Filter by has campaigns' examples: - true - in: query name: 'filter[has:consents]' description: 'Filter by consents count' required: false schema: type: boolean description: 'Filter by consents count' examples: - true - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: sort description: "Available sort options: `id`, `name`, `created_at`, `updated_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `name`, `created_at`, `updated_at`\n\nDefault: `id`" examples: - '-created_at' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ConsentDeclaration' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 550e8400-e29b-41d4-a716-446655440000 name: 'Privacy Policy' description: 'Privacy policy description' url: 'https://example.com/privacy' campaigns: - id: 101 name: Leads campaign_group_id: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' consent_setting: placeholders: {} mandatory: false created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/consent-declarations?page=1' last: 'https://api.leadvalidator.dk/consent-declarations?page=5' prev: null next: 'https://api.leadvalidator.dk/consent-declarations?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/consent-declarations' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Consents '/consent-declarations/{declaration_uuid}': get: summary: 'Show consent declaration' operationId: showConsentDeclaration description: 'Returns a single consent declaration. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `campaigns`, `consents_count`' required: false schema: type: string description: 'Available relationships: `campaigns`, `consents_count`' examples: default: value: 'campaigns,consents_count' x-disabled: false allowReserved: true responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/ConsentDeclaration' examples: default: value: id: 550e8400-e29b-41d4-a716-446655440000 name: 'Privacy Policy' description: 'Privacy policy description' url: 'https://example.com/privacy' campaigns: - id: 101 name: Leads campaign_group_id: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' consent_setting: placeholders: {} mandatory: false created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Consents parameters: - in: path name: declaration_uuid description: '' required: true schema: type: string examples: - 4d59c61e-4f51-3ffe-b4b9-e622436b6fa3 /consents: get: summary: 'Check consent' operationId: checkConsent description: 'Find out if a unique identifier has consented' parameters: - in: query name: consent_declaration_id description: 'ConsentDeclaration UUID' required: true schema: type: string description: 'ConsentDeclaration UUID' examples: - 9ab8aeb8-7733-46b5-a4fb-cbe55cbe9972 - in: query name: identifier description: 'Unique consent identifier.' required: true schema: type: string description: 'Unique consent identifier.' examples: - email@example.com responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/Consent' examples: default: value: consented_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Consents post: summary: 'Create consent' operationId: createConsent description: '' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/Consent' examples: default: value: consented_at: '2026-01-15T09:30:00.000000Z' '201': description: 'Success response' content: application/json: schema: type: object properties: success: type: boolean examples: - true examples: - success: true '400': description: 'Error response' content: application/json: schema: type: object properties: success: type: boolean examples: - false error: type: string examples: - 'Error message' examples: - success: false error: 'Error message' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '422': description: 'One or more input parameters are invalid.' content: application/json: schema: type: object properties: message: type: string examples: - 'The data was invalid.' errors: type: object properties: '{parameter}': type: array items: type: string examples: - - 'The {parameter} field is required.' examples: - message: 'The data was invalid.' errors: '{parameter}': - 'The {parameter} field is required.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Consents requestBody: required: true content: application/json: schema: type: object properties: consent_declaration_id: type: string description: 'ConsentDeclaration UUID' examples: - 9ab8aeb8-7733-46b5-a4fb-cbe55cbe9972 identifier: type: string description: 'Unique consent identifier. Separate multiple with Pipe (|).' examples: - email@example.com|+4520304050 consented_at: type: string description: 'Consent time' examples: - '2023-01-01 12:00:00' source: type: string description: 'Optional source identifier' examples: - custom-cms required: - consent_declaration_id - identifier - consented_at /contacts: get: summary: 'List contacts' operationId: listContacts description: 'Returns a paginated list of contacts. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: include description: 'Available relationships: `leads`' required: false schema: type: string description: 'Available relationships: `leads`' examples: - '' - in: query name: sort description: "Available sort options: `id`, `name`, `email`, `created_at`, `updated_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `name`, `email`, `created_at`, `updated_at`\n\nDefault: `id`" examples: - '-updated_at' - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: 'filter[id]' description: 'Filter by contact id.' required: false schema: type: string description: 'Filter by contact id.' examples: - '1,2' - in: query name: 'filter[self]' description: "Filter contact using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `email`, `created_at`, `updated_at`\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`email = test@email.com`" required: false schema: type: string description: "Filter contact using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `email`, `created_at`, `updated_at`\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`email = test@email.com`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[has:leads]' description: 'Filter by has leads' required: false schema: type: boolean description: 'Filter by has leads' examples: - true - in: query name: 'filter[created_after]' description: 'Filter by created timestamp.' required: false schema: type: string description: 'Filter by created timestamp.' examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: 'Filter by updated timestamp.' required: false schema: type: string description: 'Filter by updated timestamp.' examples: - '2026-01-15T08:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Contact' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 name: 'John Doe' email: john.doe@example.com leads: - id: 1 campaign_id: 1 token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/contacts?page=1' last: 'https://api.leadvalidator.dk/contacts?page=5' prev: null next: 'https://api.leadvalidator.dk/contacts?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/contacts' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Contacts '/contacts/{id}': get: summary: 'Show contact' operationId: showContact description: 'Returns a single contact. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `leads`' required: false schema: type: string description: 'Available relationships: `leads`' examples: - '' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/Contact' examples: default: value: id: 1 name: 'John Doe' email: john.doe@example.com leads: - id: 1 campaign_id: 1 token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Contacts parameters: - in: path name: id description: 'ID of the contact. Contact token can also be used.' required: true schema: type: integer examples: - 6 /vehicles: get: summary: 'List vehicles' operationId: listVehicles description: 'Returns a paginated list of vehicles. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: include description: 'Available relationships: `tracker`, `position`, `current_resources`' required: false schema: type: string description: 'Available relationships: `tracker`, `position`, `current_resources`' examples: default: value: 'tracker,position,current_resources' x-disabled: false allowReserved: true - in: query name: 'filter[self]' description: "Filter vehicles by various vehicle properties using [expression filters](#description/expression-filters)..\n\nAvailable properties: `id`, `license_plate`, `created_at`, `updated_at`\n\nExample: `created_at >= 2022-01-01, created_at < 2023-01-01`" required: false schema: type: string description: "Filter vehicles by various vehicle properties using [expression filters](#description/expression-filters)..\n\nAvailable properties: `id`, `license_plate`, `created_at`, `updated_at`\n\nExample: `created_at >= 2022-01-01, created_at < 2023-01-01`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[has:tracker]' description: 'Filter by has gps tracker' required: false schema: type: boolean description: 'Filter by has gps tracker' examples: - true - in: query name: 'filter[has:current_resources]' description: 'Filter by is coupled to a calendar resource' required: false schema: type: boolean description: 'Filter by is coupled to a calendar resource' examples: - true - in: query name: 'filter[created_after]' description: "Filter by vehicle's `created_at` timestamp. Short for `filter[self]=created_at >= value`" required: false schema: type: string description: "Filter by vehicle's `created_at` timestamp. Short for `filter[self]=created_at >= value`" examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: "Filter by vehicle's `updated_at` timestamp. Short for `filter[self]=updated_at >= value`" required: false schema: type: string description: "Filter by vehicle's `updated_at` timestamp. Short for `filter[self]=updated_at >= value`" examples: - '2026-01-15T08:30:00Z' - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: sort description: "Available sort options: `id`, `created_at`, `updated_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `created_at`, `updated_at`\n\nDefault: `id`" examples: - '-created_at' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Vehicle' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 name: 'Truck 1' color: '#FF5733' license_plate: AB12345 description: 'Main cargo truck' tracker: id: 101 name: 'GPS tracker 101' phone: '12345678' imei: '123456789012345' status: online disabled: false last_update: '2026-01-15T09:30:00.000000Z' position: lat: 55.67563 lng: 12.56954 altitude: 5 kph: 0 course: 270 ignition: false motion: false satellites: 16 timestamp: '2026-01-15T09:30:00.000000Z' current_resources: - id: 1 type: user user_id: 1 active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/vehicles?page=1' last: 'https://api.leadvalidator.dk/vehicles?page=5' prev: null next: 'https://api.leadvalidator.dk/vehicles?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/vehicles' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - GPS '/vehicles/{id}': get: summary: 'Show vehicle' operationId: showVehicle description: 'Returns a single vehicle. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `tracker`, `position`, `current_resources`' required: false schema: type: string description: 'Available relationships: `tracker`, `position`, `current_resources`' examples: default: value: 'tracker,position,current_resources' x-disabled: false allowReserved: true - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/Vehicle' examples: default: value: id: 1 name: 'Truck 1' color: '#FF5733' license_plate: AB12345 description: 'Main cargo truck' tracker: id: 101 name: 'GPS tracker 101' phone: '12345678' imei: '123456789012345' status: online disabled: false last_update: '2026-01-15T09:30:00.000000Z' position: lat: 55.67563 lng: 12.56954 altitude: 5 kph: 0 course: 270 ignition: false motion: false satellites: 16 timestamp: '2026-01-15T09:30:00.000000Z' current_resources: - id: 1 type: user user_id: 1 active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - GPS parameters: - in: path name: id description: 'The ID of the vehicle.' required: true schema: type: integer examples: - 6 /gps-stops: get: summary: 'List GPS stops' operationId: listGPSStops description: 'Returns a paginated list of gps stops. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: 'filter[self]' description: "Filter using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `vehicle_id`, `started_at`, `ended_at`, `duration`, `created_at`, `updated_at`" required: false schema: type: string description: "Filter using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `vehicle_id`, `started_at`, `ended_at`, `duration`, `created_at`, `updated_at`" examples: - 'started_at >= monday last week , vehicle_id IN 2;5;6' - in: query name: 'filter[created_after]' description: "Filter by gps-stop's `created_at` timestamp (time of import). Short for `filter[self]=created_at >= value`." required: false schema: type: string description: "Filter by gps-stop's `created_at` timestamp (time of import). Short for `filter[self]=created_at >= value`." examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: "Filter by gps-stop's `updated_at` timestamp. Short for `filter[self]=updated_at >= value`" required: false schema: type: string description: "Filter by gps-stop's `updated_at` timestamp. Short for `filter[self]=updated_at >= value`" examples: - '2026-01-15T08:30:00Z' - in: query name: include description: 'Available relationships: `vehicle`' required: false schema: type: string description: 'Available relationships: `vehicle`' examples: default: value: vehicle x-disabled: false allowReserved: true - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: sort description: "Available sort options: `id`, `started_at`, `ended_at`, `duration`, `created_at`, `updated_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `started_at`, `ended_at`, `duration`, `created_at`, `updated_at`\n\nDefault: `id`" examples: - '-updated_at' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/GpsStop' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 vehicle_id: 1 vehicle: id: 1 name: 'Truck 1' color: '#FF5733' license_plate: AB12345 description: 'Main cargo truck' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' started_at: '2026-01-15T09:30:00.000000Z' ended_at: '2026-01-15T09:30:00.000000Z' duration: 120 lat: 55.67247 lng: 12.55692 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/gps-stops?page=1' last: 'https://api.leadvalidator.dk/gps-stops?page=5' prev: null next: 'https://api.leadvalidator.dk/gps-stops?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/gps-stops' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - GPS '/gps-stops/{stop_id}': get: summary: 'Show GPS stop' operationId: showGPSStop description: 'Returns a single gps stop. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `vehicle`' required: false schema: type: string description: 'Available relationships: `vehicle`' examples: default: value: vehicle x-disabled: false allowReserved: true - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/GpsStop' examples: default: value: id: 1 vehicle_id: 1 vehicle: id: 1 name: 'Truck 1' color: '#FF5733' license_plate: AB12345 description: 'Main cargo truck' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' started_at: '2026-01-15T09:30:00.000000Z' ended_at: '2026-01-15T09:30:00.000000Z' duration: 120 lat: 55.67247 lng: 12.55692 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - GPS parameters: - in: path name: stop_id description: 'The ID of the stop.' required: true schema: type: integer examples: - 6 /gps-trips: get: summary: 'List GPS trips' operationId: listGPSTrips description: 'Returns a paginated list of gps trips. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: 'filter[self]' description: "Filter using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `vehicle_id`, `started_at`, `ended_at`, `duration`, `distance`, `avg_speed`, `max_speed` `created_at`, `updated_at`\n\nExamples:\n\n`started_at >= monday last week , max_speed > 110`" required: false schema: type: string description: "Filter using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `vehicle_id`, `started_at`, `ended_at`, `duration`, `distance`, `avg_speed`, `max_speed` `created_at`, `updated_at`\n\nExamples:\n\n`started_at >= monday last week , max_speed > 110`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[created_after]' description: "Filter by gps-trip's `created_at` timestamp (time of import). Short for `filter[self]=created_at >= value`." required: false schema: type: string description: "Filter by gps-trip's `created_at` timestamp (time of import). Short for `filter[self]=created_at >= value`." examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: "Filter by gps-trip's `updated_at` timestamp. Short for `filter[self]=updated_at >= value`" required: false schema: type: string description: "Filter by gps-trip's `updated_at` timestamp. Short for `filter[self]=updated_at >= value`" examples: - '2026-01-15T08:30:00Z' - in: query name: include description: 'Available relationships: `vehicle`' required: false schema: type: string description: 'Available relationships: `vehicle`' examples: default: value: vehicle x-disabled: false allowReserved: true - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: sort description: "Available sort options: `id`, `vehicle_id`, `started_at`, `ended_at`, `duration`, `distance`, `avg_speed`, `max_speed`, `created_at`, `updated_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `vehicle_id`, `started_at`, `ended_at`, `duration`, `distance`, `avg_speed`, `max_speed`, `created_at`, `updated_at`\n\nDefault: `id`" examples: - '-updated_at' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/GpsTrip' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 vehicle_id: 1 vehicle: id: 1 name: 'Truck 1' color: '#FF5733' license_plate: AB12345 description: 'Main cargo truck' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' started_at: '2026-01-15T09:30:00.000000Z' ended_at: '2026-01-15T09:30:00.000000Z' duration: 900 distance: 230.1 avg_speed: 110 max_speed: 120.5 lat_start: 83.37417 lng_start: -35.48351 lat_end: 55.67247 lng_end: 12.55692 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/gps-trips?page=1' last: 'https://api.leadvalidator.dk/gps-trips?page=5' prev: null next: 'https://api.leadvalidator.dk/gps-trips?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/gps-trips' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - GPS '/gps-trips/{trip_id}': get: summary: 'Show GPS trip' operationId: showGPSTrip description: 'Returns a single gps trip. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `vehicle`' required: false schema: type: string description: 'Available relationships: `vehicle`' examples: default: value: vehicle x-disabled: false allowReserved: true - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/GpsTrip' examples: default: value: id: 1 vehicle_id: 1 vehicle: id: 1 name: 'Truck 1' color: '#FF5733' license_plate: AB12345 description: 'Main cargo truck' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' started_at: '2026-01-15T09:30:00.000000Z' ended_at: '2026-01-15T09:30:00.000000Z' duration: 900 distance: 230.1 avg_speed: 110 max_speed: 120.5 lat_start: 83.37417 lng_start: -35.48351 lat_end: 55.67247 lng_end: 12.55692 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - GPS parameters: - in: path name: trip_id description: 'The ID of the trip.' required: true schema: type: integer examples: - 6 /leads: get: summary: 'List leads' operationId: listLeads description: 'Returns a paginated list of leads. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'This endpoint limits the maximum number of results per page to 100 (default: 25)' required: false schema: type: integer description: 'This endpoint limits the maximum number of results per page to 100 (default: 25)' examples: - 100 - in: query name: campaign_id description: 'The ID of the campaign' required: true schema: type: integer description: 'The ID of the campaign' examples: - 5 - in: query name: include description: "Available relationships: `campaign`, `status`, `status.reason`, `assignee`, `assignee.user`, `field_values`, `select_field_values`, `file_field_values`,\n `enrichment_field_values`, `nps_score`, `nps_score.comment`, `calendar_events`, `calendar_events.calendar_resources`,\n `calendar_events.calendar_services`, `comments`, `comment_uploads`, `utm_codes`, `parent_leads`, `child_leads`, `checklist_submissions`, `data_field_values`, `contact`" required: false schema: type: string description: "Available relationships: `campaign`, `status`, `status.reason`, `assignee`, `assignee.user`, `field_values`, `select_field_values`, `file_field_values`,\n `enrichment_field_values`, `nps_score`, `nps_score.comment`, `calendar_events`, `calendar_events.calendar_resources`,\n `calendar_events.calendar_services`, `comments`, `comment_uploads`, `utm_codes`, `parent_leads`, `child_leads`, `checklist_submissions`, `data_field_values`, `contact`" examples: default: value: 'campaign,status,status.reason,assignee,assignee.user,field_values,select_field_values,file_field_values,enrichment_field_values,data_field_values,nps_score,nps_score.comment,calendar_events,calendar_events.calendar_resources,calendar_events.calendar_services,comments,comment_uploads,utm_codes,parent_leads,child_leads,checklist_submissions,contact' x-disabled: false allowReserved: true - in: query name: sort description: "Available sort options: `id`, `created_at`, `updated_at`, `deleted_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `created_at`, `updated_at`, `deleted_at`\n\nDefault: `id`" examples: - '-created_at' - in: query name: include_fields description: "Limits the `field_values` returned. Use this parameter for performance reasons: The fewer fields returned, the faster the response time.\n\nExample: `field-1,field-2`\n\nSee the available field slugs for the campaign on the [API slugs page](/api-documentation?tab=slugs) (login required)." required: false schema: type: string description: "Limits the `field_values` returned. Use this parameter for performance reasons: The fewer fields returned, the faster the response time.\n\nExample: `field-1,field-2`\n\nSee the available field slugs for the campaign on the [API slugs page](/api-documentation?tab=slugs) (login required)." examples: - 'field-1,field-2' - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: 'filter[id]' description: 'Filter by lead id.' required: false schema: type: integer description: 'Filter by lead id.' examples: - 5 - in: query name: 'filter[self]' description: "Filter leads by various lead properties using [expression filters](#description/expression-filters)..\n\nAvailable properties: `id`, `created_at`, `updated_at`, `deleted_at`\n\nExample: `created_at >= 2022-01-01, created_at < 2023-01-01`" required: false schema: type: string description: "Filter leads by various lead properties using [expression filters](#description/expression-filters)..\n\nAvailable properties: `id`, `created_at`, `updated_at`, `deleted_at`\n\nExample: `created_at >= 2022-01-01, created_at < 2023-01-01`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[field_value]' description: "Filter leads by field value using [expression filters](#description/expression-filters)..\n\n\nAvailable properties: The field slug.\n\nSee the available field slugs for the campaign on the [API slugs page](/api-documentation?tab=slugs) (login required).\n\nValues: The field value.\n\nExample: `price > 100, zipcode LIKE 20*, insurer IN Topdanmark;Tryg`" required: false schema: type: string description: "Filter leads by field value using [expression filters](#description/expression-filters)..\n\n\nAvailable properties: The field slug.\n\nSee the available field slugs for the campaign on the [API slugs page](/api-documentation?tab=slugs) (login required).\n\nValues: The field value.\n\nExample: `price > 100, zipcode LIKE 20*, insurer IN Topdanmark;Tryg`" examples: - 'price > 100, zipcode LIKE 20*, insurer IN Topdanmark;Tryg' - in: query name: 'filter[select_field_value]' description: "Filter leads by select field value using [expression filters](#description/expression-filters)..\n\nSee the available field slugs for the campaign on the [API slugs page](/api-documentation?tab=slugs) (login required).\n\nValues: The option slug.\n\nExample: `select_accepted!=yes,select_type IN order;quote;not_set`" required: false schema: type: string description: "Filter leads by select field value using [expression filters](#description/expression-filters)..\n\nSee the available field slugs for the campaign on the [API slugs page](/api-documentation?tab=slugs) (login required).\n\nValues: The option slug.\n\nExample: `select_accepted!=yes,select_type IN order;quote;not_set`" examples: - 'select_accepted!=yes,select_type IN order;quote;not_set' - in: query name: 'filter[assignee]' description: "Filter leads by assignee properties using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `email`, `name`, `user_id`, `set_at`\n\nExamples:\n\n`user_id = 123`\n\n`set_at >= now -1 hour`" required: false schema: type: string description: "Filter leads by assignee properties using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `email`, `name`, `user_id`, `set_at`\n\nExamples:\n\n`user_id = 123`\n\n`set_at >= now -1 hour`" examples: - 'user_id = 123' - in: query name: 'filter[status]' description: "Filter leads by status using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `slug`, `name`, `set_at`\n\nExamples:\n\n`slug IN won;finished`\n\n`set_at >= now -1 hour`" required: false schema: type: string description: "Filter leads by status using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `slug`, `name`, `set_at`\n\nExamples:\n\n`slug IN won;finished`\n\n`set_at >= now -1 hour`" examples: - 'slug IN won;finished' - in: query name: 'filter[parent_leads]' description: "Filter by related parent leads [expression filters](#description/expression-filters).\nAvailable properties: `campaign_id`\nExample:\n\n`campaign_id = 2`" required: false schema: type: string description: "Filter by related parent leads [expression filters](#description/expression-filters).\nAvailable properties: `campaign_id`\nExample:\n\n`campaign_id = 2`" examples: - 'campaign_id = 2' - in: query name: 'filter[child_leads]' description: "Filter by related child leads [expression filters](#description/expression-filters).\nAvailable properties: `campaign_id`\nExample:\n\n`campaign_id = 2`" required: false schema: type: string description: "Filter by related child leads [expression filters](#description/expression-filters).\nAvailable properties: `campaign_id`\nExample:\n\n`campaign_id = 2`" examples: - 'campaign_id = 2' - in: query name: 'filter[nps_score]' description: "Filter leads by submitted NPS answer using [expression filters](#description/expression-filters).\n\nAvailable properties: `score`, `nps_survey_id`, `comment`, `created_at`\n\nExample: `score IN 9;10, created_at >= today, comment LIKE Very good*`" required: false schema: type: string description: "Filter leads by submitted NPS answer using [expression filters](#description/expression-filters).\n\nAvailable properties: `score`, `nps_survey_id`, `comment`, `created_at`\n\nExample: `score IN 9;10, created_at >= today, comment LIKE Very good*`" examples: - 'score IN 9;10, created_at >= today, comment LIKE Very good*' - in: query name: 'filter[calendar_events]' description: "Filter leads by related calendar events using [expression filters](#description/expression-filters).\n\nAvailable properties: `start`, `end`, `created_at`, `updated_at`, `id`, `calendar_resource_id`, `calendar_service_id`\n\nExample: `start >= today, start < tomorrow, calendar_resource_id IN 1234;4321`" required: false schema: type: string description: "Filter leads by related calendar events using [expression filters](#description/expression-filters).\n\nAvailable properties: `start`, `end`, `created_at`, `updated_at`, `id`, `calendar_resource_id`, `calendar_service_id`\n\nExample: `start >= today, start < tomorrow, calendar_resource_id IN 1234;4321`" examples: - 'start >= today, start < tomorrow, calendar_resource_id IN 1234;4321' - in: query name: 'filter[utm_codes]' description: "Filter leads by UTM codes using [expression filters](#description/expression-filters).\n\nAvailable properties: `utm_medium`, `utm_source`, `utm_campaign`, `utm_content`, `utm_term`\n\nExample: `utm_source = fb, utm_campaign IN spring1;spring2`" required: false schema: type: string description: "Filter leads by UTM codes using [expression filters](#description/expression-filters).\n\nAvailable properties: `utm_medium`, `utm_source`, `utm_campaign`, `utm_content`, `utm_term`\n\nExample: `utm_source = fb, utm_campaign IN spring1;spring2`" examples: - 'utm_source = fb, utm_campaign IN spring1;spring2' - in: query name: 'filter[contact]' description: "Filter leads by contact using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `email`, `name`, `created_at`, `updated_at`\n\nExample: `email LIKE *@example.com`" required: false schema: type: string description: "Filter leads by contact using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `email`, `name`, `created_at`, `updated_at`\n\nExample: `email LIKE *@example.com`" examples: - 'email LIKE *@example.com' - in: query name: 'filter[in_filter]' description: 'Filter leads passing specified campaign filter(s). Value is a csv list of campaign filter slugs or IDs. Each lead must pass all specified filters.' required: false schema: type: string description: 'Filter leads passing specified campaign filter(s). Value is a csv list of campaign filter slugs or IDs. Each lead must pass all specified filters.' examples: - 'hot-leads,1234' - in: query name: 'filter[has:nps_score]' description: 'Filter by has submitted NPS score' required: false schema: type: boolean description: 'Filter by has submitted NPS score' examples: - true - in: query name: 'filter[has:nps_score.comment]' description: 'Filter by has submitted an NPS score and a comment' required: false schema: type: boolean description: 'Filter by has submitted an NPS score and a comment' examples: - true - in: query name: 'filter[has:assignee]' description: 'Filter by has assigned person' required: false schema: type: boolean description: 'Filter by has assigned person' examples: - true - in: query name: 'filter[has:calendar_events]' description: 'Filter by has calendar events' required: false schema: type: boolean description: 'Filter by has calendar events' examples: - true - in: query name: 'filter[has:parent_leads]' description: 'Filter by has related parent leads' required: false schema: type: boolean description: 'Filter by has related parent leads' examples: - true - in: query name: 'filter[has:child_leads]' description: 'Filter by has related child leads' required: false schema: type: boolean description: 'Filter by has related child leads' examples: - true - in: query name: 'filter[has:comments]' description: 'Filter by has comments' required: false schema: type: boolean description: 'Filter by has comments' examples: - true - in: query name: 'filter[has:comment_uploads]' description: 'Filter by has comment uploads' required: false schema: type: boolean description: 'Filter by has comment uploads' examples: - true - in: query name: 'filter[has:file_field_values]' description: 'Filter by has enrichment field values' required: false schema: type: boolean description: 'Filter by has enrichment field values' examples: - true - in: query name: 'filter[has:checklist_submissions]' description: 'Filter by has checklist submissions' required: false schema: type: boolean description: 'Filter by has checklist submissions' examples: - true - in: query name: 'filter[has:contact]' description: 'Filter by has contact' required: false schema: type: boolean description: 'Filter by has contact' examples: - true - in: query name: 'filter[created_after]' description: 'Filter by created timestamp.' required: false schema: type: string description: 'Filter by created timestamp.' examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: "Filter leads by `updated_at` timestamp.\n\nThe `updated_at` timestamp reflects a change in any of these properties: `field_values`, `select_field_values`, `status`, `assignee`, `file_field_values`, `comments`, `comment_uploads`, `checklist_submissions`, `anonymized`, `followup`, `nps_score`" required: false schema: type: string description: "Filter leads by `updated_at` timestamp.\n\nThe `updated_at` timestamp reflects a change in any of these properties: `field_values`, `select_field_values`, `status`, `assignee`, `file_field_values`, `comments`, `comment_uploads`, `checklist_submissions`, `anonymized`, `followup`, `nps_score`" examples: - '2026-01-15T08:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Lead' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 campaign_id: 1 campaign: id: 101 name: Leads campaign_group_id: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' field_values: name: 'Jane Doe' email: jane@example.com phone: '+4512345678' enrichment_field_values: enriched_region: 'Region Hovedstaden' select_field_values: select_type: name: Private slug: private file_field_values: '': - id: 1 name: report.pdf title: 'July Report' description: 'Annual performance report' extension: pdf mime_type: application/pdf file_type: pdf kb: 1024 url: 'https://example.com/uploads/1/report.pdf' ip_address: 127.0.0.1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' data_field_values: '': id: 1 value: requestId: REQ-1001 validUntil: '2026-02-01' notes: 'Delivery before noon.' items: - description: 'Kitchen renovation' quantity: 1 unit: pcs anonymized: false created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' comments: - id: 1 message: 'This is a comment.' user_id: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' comment_uploads: - id: 1 name: report.pdf title: 'July Report' description: 'Annual performance report' extension: pdf mime_type: application/pdf file_type: pdf kb: 1024 url: 'https://example.com/uploads/1/report.pdf' ip_address: 127.0.0.1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' status: id: 1 name: string slug: string set_by_user_id: 1 set_by_automation: true set_by_api: true set_at: '2026-01-15T09:30:00.000000Z' reason: string assignee: id: 1 user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' set_by_user_id: 1 set_by_automation: true set_at: '2026-01-15T09:30:00.000000Z' nps_score: nps_survey_id: 1 score: 9 comment: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' calendar_events: - id: 1 title: Consultation location: 'Office A' description: 'Discussion about the project' start: '2026-01-15T09:30:00.000000Z' end: '2026-01-15T09:30:00.000000Z' all_day: false private: false color: '#FF5733' type: meeting allow_overlap: true content_visibility: All calendar_services: - id: 1 name: Consultation slug: consultation service_field_values: {} calendar_resources: - id: 1 type: user user_id: 1 active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' utm_codes: utm_medium: string utm_source: string utm_campaign: string utm_content: string utm_term: string parent_leads: - id: 1 campaign_id: 1 token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' child_leads: - id: 1 campaign_id: 1 token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' checklist_submissions: - id: 1 checklist_field_values: - id: 1 value: 'Sample Value' checklist_field: id: 1 name: 'Verify Email' slug: verify-email created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' contact: id: 1 name: 'John Doe' email: john.doe@example.com created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' economic: type: booked_invoice number: 1001 date: string due_date: string delivery_date: string currency: DKK vat_included: true reference: Ref123 note: 'Payment within 8 days' pdf_url: 'https://example.com/invoice.pdf' totals: net: 1000 vat: 250 gross: 1250 rounding: 0 debtor: number: '10001' name: 'Acme Corp' email: contact@acme.com phone: '12345678' address: 'Main St 1' postal_code: '1000' city: Copenhagen ean: '5790000000000' employee: number: E01 name: 'Jane Smith' email: jane.smith@example.com phone: '87654321' token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/leads?page=1' last: 'https://api.leadvalidator.dk/leads?page=5' prev: null next: 'https://api.leadvalidator.dk/leads?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/leads' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Leads post: summary: 'Create lead' operationId: createLead description: '' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/Lead' examples: default: value: id: 1 campaign_id: 1 campaign: id: 101 name: Leads campaign_group_id: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' field_values: name: 'Jane Doe' email: jane@example.com phone: '+4512345678' enrichment_field_values: enriched_region: 'Region Hovedstaden' select_field_values: select_type: name: Private slug: private file_field_values: '': - id: 1 name: report.pdf title: 'July Report' description: 'Annual performance report' extension: pdf mime_type: application/pdf file_type: pdf kb: 1024 url: 'https://example.com/uploads/1/report.pdf' ip_address: 127.0.0.1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' data_field_values: '': id: 1 value: requestId: REQ-1001 validUntil: '2026-02-01' notes: 'Delivery before noon.' items: - description: 'Kitchen renovation' quantity: 1 unit: pcs anonymized: false created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' comments: - id: 1 message: 'This is a comment.' user_id: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' comment_uploads: - id: 1 name: report.pdf title: 'July Report' description: 'Annual performance report' extension: pdf mime_type: application/pdf file_type: pdf kb: 1024 url: 'https://example.com/uploads/1/report.pdf' ip_address: 127.0.0.1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' status: id: 1 name: string slug: string set_by_user_id: 1 set_by_automation: true set_by_api: true set_at: '2026-01-15T09:30:00.000000Z' reason: string assignee: id: 1 user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' set_by_user_id: 1 set_by_automation: true set_at: '2026-01-15T09:30:00.000000Z' nps_score: nps_survey_id: 1 score: 9 comment: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' calendar_events: - id: 1 title: Consultation location: 'Office A' description: 'Discussion about the project' start: '2026-01-15T09:30:00.000000Z' end: '2026-01-15T09:30:00.000000Z' all_day: false private: false color: '#FF5733' type: meeting allow_overlap: true content_visibility: All calendar_services: - id: 1 name: Consultation slug: consultation service_field_values: {} calendar_resources: - id: 1 type: user user_id: 1 active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' utm_codes: utm_medium: string utm_source: string utm_campaign: string utm_content: string utm_term: string parent_leads: - id: 1 campaign_id: 1 token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' child_leads: - id: 1 campaign_id: 1 token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' checklist_submissions: - id: 1 checklist_field_values: - id: 1 value: 'Sample Value' checklist_field: id: 1 name: 'Verify Email' slug: verify-email created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' contact: id: 1 name: 'John Doe' email: john.doe@example.com created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' economic: type: booked_invoice number: 1001 date: string due_date: string delivery_date: string currency: DKK vat_included: true reference: Ref123 note: 'Payment within 8 days' pdf_url: 'https://example.com/invoice.pdf' totals: net: 1000 vat: 250 gross: 1250 rounding: 0 debtor: number: '10001' name: 'Acme Corp' email: contact@acme.com phone: '12345678' address: 'Main St 1' postal_code: '1000' city: Copenhagen ean: '5790000000000' employee: number: E01 name: 'Jane Smith' email: jane.smith@example.com phone: '87654321' token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '422': description: 'One or more input parameters are invalid.' content: application/json: schema: type: object properties: message: type: string examples: - 'The data was invalid.' errors: type: object properties: '{parameter}': type: array items: type: string examples: - - 'The {parameter} field is required.' examples: - message: 'The data was invalid.' errors: '{parameter}': - 'The {parameter} field is required.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Leads requestBody: required: true content: application/json: schema: type: object properties: campaign_id: type: integer description: '' examples: - 6 field_values: type: object description: 'An object of campaign fields as key-value pairs with the API name of the field as keys and the field-value as value. Dynamic keys like `%email%` can be used to target the first campaign field of that type. Available types: `%text%` (Default), `%name%` (Full name), `%first-name%` (First name), `%middle-name%` (Middle name), `%last-name%` (Last name), `%phone%` (Phone), `%email%` (Email), `%street-address%` (Street addr.), `%floor%` (Floor/Apartment/Subpremise), `%postal%` (Postal code), `%city-name%` (City name), `%full-address%` (Full address), `%country%` (Country), `%int%` (Number), `%currency-amount%` (Amount in currency), `%db-date%` (Date (strict)), `%db-time%` (Time of day (strict)), `%db-datetime%` (Date & time (strict)), `%db-birthdate%` (Date of birth (strict)), `%comment%` (Comment / Notes), , `%bool%` (Check), `%url%` (URL), `%ipv4%` (IP address), `%homepage%` (URL homepage), `%license-plate%` (License plate), `%vehicle-vin%` (Vehicle ID), `%cvr%` (CVR), `%company-name%` (Company name). Note: `%full-address%` and `%name%` may be split into separate constituent fields if no direct match is found. Similarly, passing `%street-address%`, `%postal%` and `%city-name%` may be merged into one full-address field if not direct field matches are found. Similarly, passing `%first-name%`, `%middle-name%` and `%last-name%` may be merged into a full name field.' properties: {} examples: - {} select_field_values: type: object description: 'An object of campaign select fields as key-value pairs with the select field API name as key and the select field option API name as value.' properties: {} examples: - {} status_id: type: integer description: 'The current status ID of the created lead. Specify either `status_id` OR `status_slug` - not both.' examples: - 6 status_slug: type: string description: 'The current status slug of the created lead. Specify either `status_id` OR `status_slug` - not both.' examples: - won assignee_id: type: integer description: 'The current assignee ID of the created lead. Specify either `assignee_id` OR `assignee_email` - not both.' examples: - 6 assignee_email: type: string description: 'The email of the current assignee of the created lead. Specify either `assignee_id` OR `assignee_email` - not both.' examples: - user@example.com utm_codes: type: object description: '' properties: utm_medium: type: - string - 'null' description: '' examples: - consequatur utm_source: type: - string - 'null' description: '' examples: - consequatur utm_campaign: type: - string - 'null' description: '' examples: - consequatur utm_content: type: - string - 'null' description: '' examples: - consequatur utm_term: type: - string - 'null' description: '' examples: - consequatur examples: - {} parent_lead_ids: type: array description: 'An array of existing, parent lead IDs (Hubhus IDs) that the lead is related to. A campaign relation must exist between the two campaigns.' items: type: integer examples: - - 123 child_lead_ids: type: array description: 'An array of existing, child lead IDs (Hubhus IDs) that the lead is related to. A campaign relation must exist between the two campaigns.' items: type: integer examples: - - 123 comments: type: array description: 'An array of internal comments added to the created lead.' items: type: string examples: - - 'Comment 1' - 'Comment 2' calendar_event_ids: type: array description: 'An array of existing calendar event IDs (Hubhus IDs) that the lead attends.' items: type: integer examples: - - 123 - 422 data_field_values: type: object description: 'An object of data field values as key-value pairs with the data field API name as key.' properties: {} examples: - {} calendar_events: type: array description: 'An array of calendar events that will be created by the same request and linked to the lead.' items: type: object properties: title: type: string description: 'The title of the event. Must not be greater than 191 characters.' examples: - 'Meeting with the client' all_day: type: boolean description: 'Whether the event is an all-day event. If `true` start time will be set to 00:00 and end time to 23:59.' examples: - false start: type: string description: 'The start datetime of the event. If `all_day=true` time will be set to the start of the day.' examples: - '2023-01-22T13:30:00Z' end: type: string description: 'The end datetime of the event. If `all_day=true` time will be set to the end of the day (23:59:59).' examples: - '2023-01-22T14:30:00Z' location: type: string description: 'The full address of the event. Must not be greater than 191 characters.' examples: - 'Vesterbrogade 39, 1620 København V' description: type: string description: 'The description of the event.' examples: - 'The client needs to leave exactly one hour after the event starts.' type: type: string description: 'To create a new Microsoft Teams meeting, set this to "teams". The resource must have a Microsoft Calendar coupling in order to create a Teams meeting.' enum: - default - teams examples: - teams color: type: string description: 'The background color of the event in the calendar. Format: Hex' examples: - '#1ca9c9' allow_overlap: type: boolean description: 'Whether other events can be booked at the same time. Opposite of "is busy".' examples: - false content_visibility: type: string description: 'The visibility of the event content. Default is default.' enum: - default - all - attendants - none examples: - default private: type: boolean description: 'Whether the event is a private event.' examples: - false resource_ids: type: array description: 'The calendar resource IDs (meeting attendant).' items: type: integer examples: - - 6 calendar_services: type: array description: 'An array of calendar services (meeting types) attached to this event. Each calendar service is defined an array having either an `id` or `slug` key value, and, optionally, an array of `service_field_values`. This field is not allowed if private is true.' items: type: object properties: id: type: - integer - 'null' description: 'This field is required when calendar_services.*.slug is not present. Must match an existing stored value.' examples: - 6 slug: type: - string - 'null' description: 'This field is required when calendar_services.*.id is not present. Must match an existing stored value.' examples: - consequatur service_field_values: type: - object - 'null' description: '' properties: {} examples: - null examples: - - slug: sales-meeting service_field_values: {} lead_ids: type: array description: 'The Hubhus IDs of leads attending the event. This field is not allowed if private is true.' items: type: integer examples: - - 1234 required: - start - end - resource_ids examples: - - start: '2023-01-22T13:30:00Z' end: '2023-01-22T14:30:00Z' resource_ids: - 123 consents: type: array description: 'An array of consents that the lead has given.' items: type: object properties: consent_declaration_id: type: string description: 'The UUID of the consent declaration.' examples: - 123e4567-e89b-12d3-a456-426614174000 identifier: type: string description: 'The unique identifier of the consent.' examples: - email@example.com consented_at: type: string description: 'The date and time the consent was given.' examples: - '2024-01-01 12:00:00' source: type: string description: 'The source of the consent.' examples: - 'web form' required: - consent_declaration_id - identifier examples: - - consent_declaration_id: 434f3dd4-b9c5-4777-b993-779ff21c524c consented_at: '2024-01-01 12:00:00' identifier: name@example.com required: - campaign_id '/leads/{id}': get: summary: 'Show lead' operationId: showLead description: 'Returns a single lead. Use `include` to include related resources.' parameters: - in: query name: include description: "Available relationships: `campaign`, `status`, `status.reason`, `assignee`, `assignee.user`, `field_values`, `select_field_values`, `file_field_values`,\n `enrichment_field_values`, `nps_score`, `nps_score.comment`, `calendar_events`, `calendar_events.calendar_resources`,\n `calendar_events.calendar_services`, `comments`, `comment_uploads`, `utm_codes`, `parent_leads`, `child_leads`, `checklist_submissions`, `data_field_values`, `contact`" required: false schema: type: string description: "Available relationships: `campaign`, `status`, `status.reason`, `assignee`, `assignee.user`, `field_values`, `select_field_values`, `file_field_values`,\n `enrichment_field_values`, `nps_score`, `nps_score.comment`, `calendar_events`, `calendar_events.calendar_resources`,\n `calendar_events.calendar_services`, `comments`, `comment_uploads`, `utm_codes`, `parent_leads`, `child_leads`, `checklist_submissions`, `data_field_values`, `contact`" examples: default: value: 'campaign,status,status.reason,assignee,assignee.user,field_values,select_field_values,file_field_values,enrichment_field_values,data_field_values,nps_score,nps_score.comment,calendar_events,calendar_events.calendar_resources,calendar_events.calendar_services,comments,comment_uploads,utm_codes,parent_leads,child_leads,checklist_submissions,contact' x-disabled: false allowReserved: true - in: query name: include_fields description: "Limits the `field_values` returned. Use this parameter for performance reasons: The fewer fields returned, the faster the response time.\n\nExample: `field-1,field-2`\n\nSee the available field slugs for the campaign on the [API slugs page](/api-documentation?tab=slugs) (login required)." required: false schema: type: string description: "Limits the `field_values` returned. Use this parameter for performance reasons: The fewer fields returned, the faster the response time.\n\nExample: `field-1,field-2`\n\nSee the available field slugs for the campaign on the [API slugs page](/api-documentation?tab=slugs) (login required)." examples: - 'field-1,field-2' - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/Lead' examples: default: value: id: 1 campaign_id: 1 campaign: id: 101 name: Leads campaign_group_id: 1 order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' field_values: name: 'Jane Doe' email: jane@example.com phone: '+4512345678' enrichment_field_values: enriched_region: 'Region Hovedstaden' select_field_values: select_type: name: Private slug: private file_field_values: '': - id: 1 name: report.pdf title: 'July Report' description: 'Annual performance report' extension: pdf mime_type: application/pdf file_type: pdf kb: 1024 url: 'https://example.com/uploads/1/report.pdf' ip_address: 127.0.0.1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' data_field_values: '': id: 1 value: requestId: REQ-1001 validUntil: '2026-02-01' notes: 'Delivery before noon.' items: - description: 'Kitchen renovation' quantity: 1 unit: pcs anonymized: false created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' comments: - id: 1 message: 'This is a comment.' user_id: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' comment_uploads: - id: 1 name: report.pdf title: 'July Report' description: 'Annual performance report' extension: pdf mime_type: application/pdf file_type: pdf kb: 1024 url: 'https://example.com/uploads/1/report.pdf' ip_address: 127.0.0.1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' status: id: 1 name: string slug: string set_by_user_id: 1 set_by_automation: true set_by_api: true set_at: '2026-01-15T09:30:00.000000Z' reason: string assignee: id: 1 user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' set_by_user_id: 1 set_by_automation: true set_at: '2026-01-15T09:30:00.000000Z' nps_score: nps_survey_id: 1 score: 9 comment: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' calendar_events: - id: 1 title: Consultation location: 'Office A' description: 'Discussion about the project' start: '2026-01-15T09:30:00.000000Z' end: '2026-01-15T09:30:00.000000Z' all_day: false private: false color: '#FF5733' type: meeting allow_overlap: true content_visibility: All calendar_services: - id: 1 name: Consultation slug: consultation service_field_values: {} calendar_resources: - id: 1 type: user user_id: 1 active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' utm_codes: utm_medium: string utm_source: string utm_campaign: string utm_content: string utm_term: string parent_leads: - id: 1 campaign_id: 1 token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' child_leads: - id: 1 campaign_id: 1 token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' checklist_submissions: - id: 1 checklist_field_values: - id: 1 value: 'Sample Value' checklist_field: id: 1 name: 'Verify Email' slug: verify-email created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' contact: id: 1 name: 'John Doe' email: john.doe@example.com created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' economic: type: booked_invoice number: 1001 date: string due_date: string delivery_date: string currency: DKK vat_included: true reference: Ref123 note: 'Payment within 8 days' pdf_url: 'https://example.com/invoice.pdf' totals: net: 1000 vat: 250 gross: 1250 rounding: 0 debtor: number: '10001' name: 'Acme Corp' email: contact@acme.com phone: '12345678' address: 'Main St 1' postal_code: '1000' city: Copenhagen ean: '5790000000000' employee: number: E01 name: 'Jane Smith' email: jane.smith@example.com phone: '87654321' token: string token_short: string created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Leads patch: summary: 'Update lead' operationId: updateLead description: 'Omitted properties are left untouched.' responses: '204': description: 'Successfully updated.' content: application/json: schema: type: - object - 'null' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '422': description: 'One or more input parameters are invalid.' content: application/json: schema: type: object properties: message: type: string examples: - 'The data was invalid.' errors: type: object properties: '{parameter}': type: array items: type: string examples: - - 'The {parameter} field is required.' examples: - message: 'The data was invalid.' errors: '{parameter}': - 'The {parameter} field is required.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Leads requestBody: required: false content: application/json: schema: type: object properties: campaign_id: type: - integer - 'null' description: '' examples: - 6 field_values: type: object description: 'An object of campaign fields as key-value pairs with the API name of the field as keys and the field-value as value. Dynamic keys like `%email%` can be used to target the first campaign field of that type. Available types: `%text%` (Default), `%name%` (Full name), `%first-name%` (First name), `%middle-name%` (Middle name), `%last-name%` (Last name), `%phone%` (Phone), `%email%` (Email), `%street-address%` (Street addr.), `%floor%` (Floor/Apartment/Subpremise), `%postal%` (Postal code), `%city-name%` (City name), `%full-address%` (Full address), `%country%` (Country), `%int%` (Number), `%currency-amount%` (Amount in currency), `%db-date%` (Date (strict)), `%db-time%` (Time of day (strict)), `%db-datetime%` (Date & time (strict)), `%db-birthdate%` (Date of birth (strict)), `%comment%` (Comment / Notes), , `%bool%` (Check), `%url%` (URL), `%ipv4%` (IP address), `%homepage%` (URL homepage), `%license-plate%` (License plate), `%vehicle-vin%` (Vehicle ID), `%cvr%` (CVR), `%company-name%` (Company name). Note: `%full-address%` and `%name%` may be split into separate constituent fields if no direct match is found. Similarly, passing `%street-address%`, `%postal%` and `%city-name%` may be merged into one full-address field if not direct field matches are found. Similarly, passing `%first-name%`, `%middle-name%` and `%last-name%` may be merged into a full name field.' properties: {} examples: - {} select_field_values: type: object description: 'An object of campaign select fields as key-value pairs with the select field API name as key and the select field option API name as value.' properties: {} examples: - {} status_id: type: integer description: 'The current status ID of the created lead. Specify either `status_id` OR `status_slug` - not both.' examples: - 6 status_slug: type: string description: 'The current status slug of the created lead. Specify either `status_id` OR `status_slug` - not both.' examples: - won assignee_id: type: integer description: 'The current assignee ID of the created lead. Specify either `assignee_id` OR `assignee_email` - not both.' examples: - 6 assignee_email: type: string description: 'The email of the current assignee of the created lead. Specify either `assignee_id` OR `assignee_email` - not both.' examples: - user@example.com utm_codes: type: object description: '' properties: utm_medium: type: - string - 'null' description: '' examples: - consequatur utm_source: type: - string - 'null' description: '' examples: - consequatur utm_campaign: type: - string - 'null' description: '' examples: - consequatur utm_content: type: - string - 'null' description: '' examples: - consequatur utm_term: type: - string - 'null' description: '' examples: - consequatur examples: - {} parent_lead_ids: type: array description: 'An array of existing, parent lead IDs (Hubhus IDs) that the lead is related to. A campaign relation must exist between the two campaigns. If included in the request, any existing relations not included in the list will be decoupled.' items: type: integer examples: - - 123 child_lead_ids: type: array description: 'An array of existing, child lead IDs (Hubhus IDs) that the lead is related to. A campaign relation must exist between the two campaigns. If included in the request, any existing relations not included in the list will be decoupled.' items: type: integer examples: - - 123 comments: type: array description: 'An array of internal comments added to the created lead.' items: type: string examples: - - 'Comment 1' - 'Comment 2' calendar_event_ids: type: array description: 'An array of existing calendar event IDs (Hubhus IDs) that the lead attends. Existing, related `calendar_event_ids` not included in the array will be decoupled from the lead. Pass an empty array to decouple all calendar-events.' items: type: integer examples: - - 123 - 422 data_field_values: type: object description: 'An object of data field values as key-value pairs with the data field API name as key.' properties: {} examples: - {} consents: type: array description: 'An array of consents that the lead has given.' items: type: object examples: - - consent_declaration_id: 434f3dd4-b9c5-4777-b993-779ff21c524c consented_at: '2024-01-01 12:00:00' identifier: name@example.com delete: summary: 'Delete lead' operationId: deleteLead description: '' responses: '204': description: 'Successfully deleted.' content: application/json: schema: type: - object - 'null' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Leads parameters: - in: path name: id description: 'The ID of the lead.' required: true schema: type: integer examples: - 6 /microsoft-events: get: summary: 'List microsoft events' operationId: listMicrosoftEvents description: 'Returns a paginated list of microsoft events. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: include description: 'Available relationships: `calendar_resources`, `calendar_resources.user`' required: false schema: type: string description: 'Available relationships: `calendar_resources`, `calendar_resources.user`' examples: default: value: calendar_resources.user x-disabled: false allowReserved: true - in: query name: sort description: "Available sort options: `id`, `start`, `end`, `created_at`, `updated_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `start`, `end`, `created_at`, `updated_at`\n\nDefault: `id`" examples: - id - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: 'filter[id]' description: 'Filter by Microsoft event id.' required: false schema: type: string description: 'Filter by Microsoft event id.' examples: - '1,2' - in: query name: 'filter[self]' description: "Filter Microsoft events using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `start`, `end`, `title`, `location`, `type`, `created_at`, `updated_at`,\n\n**Note** that filtering on the `type` property requires the `{value}` to be either `default` or `teams`.\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`type = teams, start >= today, start < tomorrow`" required: false schema: type: string description: "Filter Microsoft events using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `start`, `end`, `title`, `location`, `type`, `created_at`, `updated_at`,\n\n**Note** that filtering on the `type` property requires the `{value}` to be either `default` or `teams`.\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`type = teams, start >= today, start < tomorrow`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[calendar_resources]' description: "Filter Microsoft events by attending calendar resource using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `email`, `resource_group_id`, `resource_team_id`\n\nExample: `email = resource@email.com`" required: false schema: type: string description: "Filter Microsoft events by attending calendar resource using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `email`, `resource_group_id`, `resource_team_id`\n\nExample: `email = resource@email.com`" examples: - 'email = resource@email.com' - in: query name: 'filter[created_after]' description: "Filter by Microsoft event's `created_at` timestamp. Short for `filter[{property}]=created_at >= value`" required: false schema: type: string description: "Filter by Microsoft event's `created_at` timestamp. Short for `filter[{property}]=created_at >= value`" examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: "Filter by Microsoft event's `updated_at` timestamp. Short for `filter[{property}]=updated_at >= value`" required: false schema: type: string description: "Filter by Microsoft event's `updated_at` timestamp. Short for `filter[{property}]=updated_at >= value`" examples: - '2026-01-15T08:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/MicrosoftEvent' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 title: string location: string start: '2026-01-15T09:30:00.000000Z' end: '2026-01-15T09:30:00.000000Z' all_day: true private: true type: string content_visibility: string calendar_resources: - id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/microsoft-events?page=1' last: 'https://api.leadvalidator.dk/microsoft-events?page=5' prev: null next: 'https://api.leadvalidator.dk/microsoft-events?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/microsoft-events' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Microsoft Events' '/microsoft-events/{id}': get: summary: 'Show microsoft event' operationId: showMicrosoftEvent description: 'Returns a single microsoft event. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `calendar_resources`, `calendar_resources.user`' required: false schema: type: string description: 'Available relationships: `calendar_resources`, `calendar_resources.user`' examples: default: value: calendar_resources.user x-disabled: false allowReserved: true - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/MicrosoftEvent' examples: default: value: id: 1 title: string location: string start: '2026-01-15T09:30:00.000000Z' end: '2026-01-15T09:30:00.000000Z' all_day: true private: true type: string content_visibility: string calendar_resources: - id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Microsoft Events' parameters: - in: path name: id description: 'The ID of the microsoft event.' required: true schema: type: integer examples: - 6 /products: get: summary: 'List products' operationId: listProducts description: 'Returns a paginated list of products. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: include description: 'Available relationships: `product_category`, `image`, `tags`, `product_fields`, `created_by`, `updated_by`, `deleted_by`' required: false schema: type: string description: 'Available relationships: `product_category`, `image`, `tags`, `product_fields`, `created_by`, `updated_by`, `deleted_by`' examples: default: value: 'product_category,tags,image,product_fields,created_by,updated_by,deleted_by' x-disabled: false allowReserved: true - in: query name: sort description: "Available sort options: `id`, `name`, `sku`, `type`, `is_bundle`, `is_active`, `sales_price_minor`, `cost_price_minor`, `created_at`, `updated_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `name`, `sku`, `type`, `is_bundle`, `is_active`, `sales_price_minor`, `cost_price_minor`, `created_at`, `updated_at`\n\nDefault: `id`" examples: - name - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: 'filter[id]' description: 'Filter by product id.' required: false schema: type: string description: 'Filter by product id.' examples: - '1,2' - in: query name: 'filter[type]' description: 'Filter by product type.' required: false schema: type: string description: 'Filter by product type.' examples: - service - in: query name: 'filter[is_bundle]' description: 'Filter by bundle status.' required: false schema: type: boolean description: 'Filter by bundle status.' examples: - true - in: query name: 'filter[is_active]' description: 'Filter by active status.' required: false schema: type: boolean description: 'Filter by active status.' examples: - true - in: query name: 'filter[self]' description: "Filter products using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `product_category_id`, `created_by_id`, `updated_by_id`, `deleted_by_id`, `image_id`, `type`, `sku`, `name`, `internal_name`, `description`, `internal_notes`, `unit`, `sales_price_minor`, `cost_price_minor`, `currency_code`, `is_bundle`, `is_active`, `created_at`, `updated_at`" required: false schema: type: string description: "Filter products using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `product_category_id`, `created_by_id`, `updated_by_id`, `deleted_by_id`, `image_id`, `type`, `sku`, `name`, `internal_name`, `description`, `internal_notes`, `unit`, `sales_price_minor`, `cost_price_minor`, `currency_code`, `is_bundle`, `is_active`, `created_at`, `updated_at`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[has:product_category]' description: 'Filter by whether the product has a category.' required: false schema: type: boolean description: 'Filter by whether the product has a category.' examples: - true - in: query name: 'filter[has:image]' description: 'Filter by whether the product has an image.' required: false schema: type: boolean description: 'Filter by whether the product has an image.' examples: - true - in: query name: 'filter[has:tags]' description: 'Filter by whether the product has tags.' required: false schema: type: boolean description: 'Filter by whether the product has tags.' examples: - true - in: query name: 'filter[created_after]' description: 'Filter by created timestamp.' required: false schema: type: string description: 'Filter by created timestamp.' examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: 'Filter by updated timestamp.' required: false schema: type: string description: 'Filter by updated timestamp.' examples: - '2026-01-15T08:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Product' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 product_category_id: 1 product_category: id: 1 name: 'Consultation Category' description: 'Category for consultations' color: '#FF5733' is_active: true order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_by_id: 1 created_by: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' updated_by_id: 1 updated_by: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' deleted_by_id: null deleted_by: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' image_id: 1 image: id: 1 name: report.pdf title: 'July Report' description: 'Annual performance report' extension: pdf mime_type: application/pdf file_type: pdf kb: 1024 url: 'https://example.com/uploads/1/report.pdf' ip_address: 127.0.0.1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' tags: - id: 1 name: Premium created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' product_fields: {} type: physical sku: PROD-001 name: Consultation internal_name: 'Consultation Internal' description: 'Consultation service' internal_notes: 'Internal notes about consultation' unit: pcs sales_price_minor: 50000 cost_price_minor: 30000 effective_sales_price_minor: 50000 effective_cost_price_minor: 30000 currency_code: DKK is_active: true is_bundle: false created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/products?page=1' last: 'https://api.leadvalidator.dk/products?page=5' prev: null next: 'https://api.leadvalidator.dk/products?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/products' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Products (beta)' '/products/{id}': get: summary: 'Show product' operationId: showProduct description: 'Returns a single product. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `product_category`, `image`, `tags`, `product_fields`, `created_by`, `updated_by`, `deleted_by`' required: false schema: type: string description: 'Available relationships: `product_category`, `image`, `tags`, `product_fields`, `created_by`, `updated_by`, `deleted_by`' examples: default: value: 'product_category,tags,image,product_fields,created_by,updated_by,deleted_by' x-disabled: false allowReserved: true - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/Product' examples: default: value: id: 1 product_category_id: 1 product_category: id: 1 name: 'Consultation Category' description: 'Category for consultations' color: '#FF5733' is_active: true order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_by_id: 1 created_by: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' updated_by_id: 1 updated_by: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' deleted_by_id: null deleted_by: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' image_id: 1 image: id: 1 name: report.pdf title: 'July Report' description: 'Annual performance report' extension: pdf mime_type: application/pdf file_type: pdf kb: 1024 url: 'https://example.com/uploads/1/report.pdf' ip_address: 127.0.0.1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' tags: - id: 1 name: Premium created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' product_fields: {} type: physical sku: PROD-001 name: Consultation internal_name: 'Consultation Internal' description: 'Consultation service' internal_notes: 'Internal notes about consultation' unit: pcs sales_price_minor: 50000 cost_price_minor: 30000 effective_sales_price_minor: 50000 effective_cost_price_minor: 30000 currency_code: DKK is_active: true is_bundle: false created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Products (beta)' parameters: - in: path name: id description: 'The ID of the product.' required: true schema: type: integer examples: - 6 /time-tracking/tags: get: summary: 'List time tags' operationId: listTimeTags description: 'Returns a paginated list of time tags. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: sort description: "Available sort options: `id`, `name`, `created_at`, `updated_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `name`, `created_at`, `updated_at`\n\nDefault: `id`" examples: - id - in: query name: 'filter[self]' description: "Filter time tags using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `exclusive`, `created_at`, `updated_at`," required: false schema: type: string description: "Filter time tags using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `exclusive`, `created_at`, `updated_at`," examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[created_after]' description: "Filter by Time tag's `created_at` timestamp. Short for `filter[{property}]=created_at >= value`" required: false schema: type: string description: "Filter by Time tag's `created_at` timestamp. Short for `filter[{property}]=created_at >= value`" examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: "Filter by Time tag's `updated_at` timestamp. Short for `filter[{property}]=updated_at >= value`" required: false schema: type: string description: "Filter by Time tag's `updated_at` timestamp. Short for `filter[{property}]=updated_at >= value`" examples: - '2026-01-15T08:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/TimeTag' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 name: string exclusive: true created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/time-tags?page=1' last: 'https://api.leadvalidator.dk/time-tags?page=5' prev: null next: 'https://api.leadvalidator.dk/time-tags?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/time-tags' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Time tracking (beta)' /time-tracking/entries: get: summary: 'List time entries' operationId: listTimeEntries description: 'Returns a paginated list of time entries. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: include description: 'Available relationships: `calendar_resource`, `calendar_resource.user`, `calendar_event`, `tags`' required: false schema: type: string description: 'Available relationships: `calendar_resource`, `calendar_resource.user`, `calendar_event`, `tags`' examples: default: value: 'calendar_resource,tags' x-disabled: false allowReserved: true - in: query name: sort description: "Available sort options: `id`, `start`, `end`, `created_at`, `updated_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `start`, `end`, `created_at`, `updated_at`\n\nDefault: `id`" examples: - id - in: query name: 'filter[self]' description: "Filter entries using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `start`, `end`, `comment`, `break_minutes`, `created_at`, `updated_at`," required: false schema: type: string description: "Filter entries using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `start`, `end`, `comment`, `break_minutes`, `created_at`, `updated_at`," examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[has:calendar_event]' description: 'Filter by has calendar event / has no calendar event.' required: false schema: type: boolean description: 'Filter by has calendar event / has no calendar event.' examples: - true - in: query name: 'filter[calendar_event]' description: "Filter entries by related calendar event using [expression filters](#description/expression-filters).\n\nAvailable properties: `start`, `end`, `created_at`, `updated_at`, `id`, `calendar_resource_id`, `calendar_service_id`\n\nExample: `start >= today, start < tomorrow, calendar_resource_id IN 1234;4321`" required: false schema: type: string description: "Filter entries by related calendar event using [expression filters](#description/expression-filters).\n\nAvailable properties: `start`, `end`, `created_at`, `updated_at`, `id`, `calendar_resource_id`, `calendar_service_id`\n\nExample: `start >= today, start < tomorrow, calendar_resource_id IN 1234;4321`" examples: - 'start >= today, start < tomorrow, calendar_resource_id IN 1234;4321' - in: query name: 'filter[calendar_resource]' description: "Filter entries by calendar resource using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `email`, `resource_group_id`, `resource_team_id`\n\nExample: `email = resource@email.com`" required: false schema: type: string description: "Filter entries by calendar resource using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `email`, `resource_group_id`, `resource_team_id`\n\nExample: `email = resource@email.com`" examples: - 'email = resource@email.com' - in: query name: 'filter[has:tags]' description: 'Filter by has tags / has no tags.' required: false schema: type: boolean description: 'Filter by has tags / has no tags.' examples: - true - in: query name: 'filter[tags]' description: "Filter entries by related tags using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`\n\nExample: `name LIKE *installation`" required: false schema: type: string description: "Filter entries by related tags using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`\n\nExample: `name LIKE *installation`" examples: - 'name LIKE *installation' - in: query name: 'filter[created_after]' description: 'Filter by `created_at` timestamp. Short for `filter[{property}]=created_at >= value`' required: false schema: type: string description: 'Filter by `created_at` timestamp. Short for `filter[{property}]=created_at >= value`' examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: 'Filter by `updated_at` timestamp. Short for `filter[{property}]=updated_at >= value`' required: false schema: type: string description: 'Filter by `updated_at` timestamp. Short for `filter[{property}]=updated_at >= value`' examples: - '2026-01-15T08:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/TimeEntry' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 start: '2026-01-15T09:30:00.000000Z' end: '2026-01-15T09:30:00.000000Z' comment: string break_minutes: 1 calendar_event: id: 1 title: Consultation location: 'Office A' description: 'Discussion about the project' start: '2026-01-15T09:30:00.000000Z' end: '2026-01-15T09:30:00.000000Z' all_day: false private: false color: '#FF5733' type: meeting allow_overlap: true content_visibility: All created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' calendar_resource: id: 1 type: user user_id: 1 user: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' tags: - id: 1 name: string exclusive: true created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/time-entries?page=1' last: 'https://api.leadvalidator.dk/time-entries?page=5' prev: null next: 'https://api.leadvalidator.dk/time-entries?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/time-entries' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - 'Time tracking (beta)' /users: get: summary: 'List users' operationId: listUsers description: 'Returns a paginated list of users. Use `include` to include related resources. Use `filter` to filter the results. Use `sort` to sort the results.' parameters: - in: query name: page description: 'The page number. Must be at least 1.' required: false schema: type: - integer - 'null' description: 'The page number. Must be at least 1.' examples: - 1 - in: query name: per_page description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' required: false schema: type: - integer - 'null' description: 'The number of items per page. Must be at least 1. Must not be greater than 500.' examples: - 25 - in: query name: include description: 'Available relationships: `calendar_resource`, `user_tags`' required: false schema: type: string description: 'Available relationships: `calendar_resource`, `user_tags`' examples: - '' - in: query name: sort description: "Available sort options: `id`, `name`, `email`, `phone`, `department`, `role`, `last_seen_at`, `deactivated_at`, `created_at`, `updated_at`\n\nDefault: `id`" required: false schema: type: string description: "Available sort options: `id`, `name`, `email`, `phone`, `department`, `role`, `last_seen_at`, `deactivated_at`, `created_at`, `updated_at`\n\nDefault: `id`" examples: - '-updated_at' - in: query name: include_urls description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" required: false schema: type: boolean description: "Whether to include entity URLs in the returned data.\n\nAvailable options: `false`, `true`\n\nDefault: `false`" examples: - false - in: query name: 'filter[id]' description: 'Filter by user id.' required: false schema: type: string description: 'Filter by user id.' examples: - '1,2' - in: query name: 'filter[self]' description: "Filter user using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `email`, `phone`, `department`, `role`, `last_seen_at`, `deactivated_at`, `created_at`, `updated_at`\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`email = test@email.com`" required: false schema: type: string description: "Filter user using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`, `email`, `phone`, `department`, `role`, `last_seen_at`, `deactivated_at`, `created_at`, `updated_at`\n\nExamples:\n\n`created_at >= monday last week , created_at < monday this week`\n\n`email = test@email.com`" examples: - 'created_at < 2026-01-15T00:00:00Z, updated_at > now -2 days' - in: query name: 'filter[user_tags]' description: "Filter users by their user tags using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`\n\nExample: `name IN tag-1;tag-2`" required: false schema: type: string description: "Filter users by their user tags using [expression filters](#description/expression-filters).\n\nAvailable properties: `id`, `name`\n\nExample: `name IN tag-1;tag-2`" examples: - 'name IN tag-1;tag-2' - in: query name: 'filter[is:active]' description: 'Filter by is active. An active user is one where `"deactivated_at": null`' required: false schema: type: boolean description: 'Filter by is active. An active user is one where `"deactivated_at": null`' examples: - true - in: query name: 'filter[has:calendar_resource]' description: 'Filter by has calendar resource' required: false schema: type: boolean description: 'Filter by has calendar resource' examples: - true - in: query name: 'filter[has:user_tags]' description: 'Filter by has user tags' required: false schema: type: boolean description: 'Filter by has user tags' examples: - true - in: query name: 'filter[created_after]' description: 'Filter by created timestamp.' required: false schema: type: string description: 'Filter by created timestamp.' examples: - '2026-01-15T08:30:00Z' - in: query name: 'filter[updated_after]' description: 'Filter by updated timestamp.' required: false schema: type: string description: 'Filter by updated timestamp.' examples: - '2026-01-15T08:30:00Z' responses: '200': description: '' content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/User' links: type: object properties: first: type: string last: type: string prev: type: - string - 'null' next: type: - string - 'null' meta: type: object properties: current_page: type: integer from: type: - integer - 'null' last_page: type: integer path: type: string per_page: type: integer to: type: - integer - 'null' total: type: integer required: - data - links - meta examples: default: value: data: - id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' user_tags: - id: 1 name: Sales user_has_calendar: true user_default_values: {} order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' calendar_resource: id: 1 type: user user_id: 1 active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' user_field_values: {} last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' links: first: 'https://api.leadvalidator.dk/users?page=1' last: 'https://api.leadvalidator.dk/users?page=5' prev: null next: 'https://api.leadvalidator.dk/users?page=2' meta: current_page: 1 from: 1 last_page: 5 path: 'https://api.leadvalidator.dk/users' per_page: 25 to: 25 total: 125 '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Users post: summary: 'Create user' operationId: createUser description: '' responses: '201': description: 'Successfully created.' content: application/json: schema: $ref: '#/components/schemas/User' examples: default: value: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' user_tags: - id: 1 name: Sales user_has_calendar: true user_default_values: {} order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' calendar_resource: id: 1 type: user user_id: 1 active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' user_field_values: {} last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '422': description: 'One or more input parameters are invalid.' content: application/json: schema: type: object properties: message: type: string examples: - 'The data was invalid.' errors: type: object properties: '{parameter}': type: array items: type: string examples: - - 'The {parameter} field is required.' examples: - message: 'The data was invalid.' errors: '{parameter}': - 'The {parameter} field is required.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Users requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'User name.' examples: - 'John Doe' email: type: string description: 'User email.' examples: - john@example.com phone: type: string description: 'User phone.' examples: - '+4512345678' department: type: string description: 'User department.' examples: - Sales role: type: string description: 'User role.' examples: - Manager user_tag_ids: type: array description: 'User tag IDs to assign.' items: type: integer examples: - - 1 - 2 required: - name - email '/users/{id}': get: summary: 'Show user' operationId: showUser description: 'Returns a single user. Use `include` to include related resources.' parameters: - in: query name: include description: 'Available relationships: `calendar_resource`, `user_tags`' required: false schema: type: string description: 'Available relationships: `calendar_resource`, `user_tags`' examples: - '' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/User' examples: default: value: id: 1 name: 'John Doe' email: john.doe@example.com phone: 000-000-0000 active: true department: Sales role: 'Sales Executive' user_tags: - id: 1 name: Sales user_has_calendar: true user_default_values: {} order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' calendar_resource: id: 1 type: user user_id: 1 active: true background_color: '#FF5733' duration_factor: '1.0' order_weight: 1 created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' user_field_values: {} last_seen_at: '2026-01-15T09:30:00.000000Z' deactivated_at: '2026-01-15T09:30:00.000000Z' created_at: '2026-01-15T09:30:00.000000Z' updated_at: '2026-01-15T09:30:00.000000Z' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Users patch: summary: 'Update user' operationId: updateUser description: 'Omitted properties are left untouched.' responses: '204': description: 'Successfully updated.' content: application/json: schema: type: - object - 'null' '403': description: 'The API Token does not grant access to the requested resource or action.' content: application/json: schema: type: object properties: message: type: string examples: - 'The API token does not grant access to the requested resource or action.' examples: - message: 'The API token does not grant access to the requested resource or action.' '404': description: 'The requested resource {id} was not found.' content: application/json: schema: type: object properties: message: type: string examples: - 'Resource not found.' examples: - message: 'Resource not found.' '422': description: 'Only regular users can be updated via this endpoint.' content: application/json: schema: type: - object - 'null' '429': description: 'Too many attempts: rate limit reached.' content: application/json: schema: type: object properties: message: type: string examples: - 'Too many attempts, slow down. The rate limit is reached.' examples: - message: 'Too many attempts, slow down. The rate limit is reached.' tags: - Users requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'User name.' examples: - 'John Doe' email: type: string description: 'User email.' examples: - john@example.com phone: type: string description: 'User phone.' examples: - '+4512345678' department: type: string description: 'User department.' examples: - Sales role: type: string description: 'User role.' examples: - Manager user_tag_ids: type: array description: 'User tag IDs to assign.' items: type: integer examples: - - 1 - 2 deactivated: type: boolean description: 'Set to deactivate or reactivate the user.' examples: - false parameters: - in: path name: id description: 'The ID of the user.' required: true schema: type: integer examples: - 6