openapi: 3.1.0 info: title: 'Hubhus API' description: "
\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`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 isdefault.'
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:
'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:
'