Recurrences

Standing agreements (återkommande avtal): a customer, a template job and an iCalendar rule. Closepact writes the jobs ahead of time every night, once per date, and they can be generated on demand.

Recurring jobs are included from the Väx tier of booking (booking.recurring). Below it, writing an agreement answers 402, existing agreements stay readable, and no jobs are generated from them.

List recurrences

GET/recurrences

Standing agreements ordered by start date. due_before answers "which agreements produce work before this date" from next_run_on. Cursor-paginated: pass next_cursor as cursor.

curl 'https://api.closepact.com/v1/api/recurrences' \
  -H "Authorization: Bearer $CLOSEPACT_API_KEY"
Response · 200
{
  "data": [
    {
      "id": "01a15c30-6f70-7364-b5c6-d7e82f354189",
      "sub_entity_id": null,
      "account_id": "01a15c02-4e1a-7b3c-9d2e-5f60a7b8c901",
      "customer": {
        "id": "01a15c02-4e1a-7b3c-9d2e-5f60a7b8c901",
        "name": "Brf Linden",
        "customer_number": "10231"
      },
      "rrule": "FREQ=WEEKLY;INTERVAL=2;BYDAY=MO",
      "template": {
        "title": "Trappstädning – Brf Linden, Storgatan 12",
        "service_address_id": "01a15c02-4e1c-7d5e-9f40-7182c9daeb23",
        "price_model": "fixed",
        "agreed_price_cents": 145000,
        "start_time": "06:30",
        "duration_minutes": 120
      },
      "starts_on": "2026-11-02",
      "ends_on": "2027-06-28",
      "next_run_on": "2026-11-30",
      "status": "active",
      "lead_time_days": 21,
      "last_generated_at": "2026-11-02T03:00:12+00:00",
      "created_at": "2026-10-20T10:12:00+00:00",
      "updated_at": "2026-11-02T03:00:12+00:00"
    }
  ],
  "path": "https://api.closepact.com/v1/api/recurrences",
  "per_page": 50,
  "next_cursor": null,
  "next_page_url": null,
  "prev_cursor": null,
  "prev_page_url": null
}

Query parameters

  • qstring

    Search in the customer name (case-insensitive, substring).

    Example Linden

  • filter[status]string

    Only these statuses. Repeat as filter[status][]=active&filter[status][]=paused for several.

    One ofactivepausedcompleted

    Example active

  • filter[account_id]string(uuid)

    Only this customer's agreements.

  • due_beforestring(date)

    Only agreements whose next_run_on is on or before this date. Calendar date, YYYY-MM-DD.

    Example 2026-12-01

  • limitinteger

    Items per page, 1–200.

    Default 501–200

  • cursorstring

    Opaque cursor from meta.next_cursor or meta.prev_cursor of the previous page.

Responses

  • Headers

    • X-RateLimit-Limit — Requests this key may make per minute.
    • X-RateLimit-Remaining — Requests left in the current minute.

    A page of a cursor-paginated list. Pass next_cursor as cursor to fetch the next page; it is null on the last page.

    • dataarray of objectsrequired
      • idstring(uuid)required

        The recurrence id.

      • sub_entity_idstring(uuid)nullablerequired

        The office (sub-entity) it belongs to, and every job it writes; or null.

      • account_idstring(uuid)required

        The customer.

      • customerobjectnullablerequired

        The customer, or null where not loaded (the recurrence inside a generate result).

      • rrulestringrequired

        iCalendar recurrence rule (RFC 5545), limited to FREQ=DAILY|WEEKLY|MONTHLY, INTERVAL, BYDAY (MO…SU, no positions), COUNT and UNTIL. Weeks start on Monday.

      • templateobjectrequired

        What each generated job looks like. Only these keys exist; any other key is refused with 422 (a misspelt titel would otherwise be dropped silently).

      • starts_onstring(date)required

        First day of the agreement. Calendar date, YYYY-MM-DD.

      • ends_onstring(date)nullablerequired

        Last day, or null for open-ended. Calendar date, YYYY-MM-DD.

      • next_run_onstring(date)nullablerequired

        The next date the rule will write a job for, or null when it has run out. Calendar date, YYYY-MM-DD.

      • statusstringrequired

        active agreements write jobs; paused ones wait (a customer away for the summer); completed ones have run out — set by the generator when the rule produces no more dates, or by you.

        One ofactivepausedcompleted

      • lead_time_daysintegerrequired

        How far ahead jobs are written, in days (1–120).

      • last_generated_atstring(date-time)nullablerequired

        When jobs were last generated, or null.

      • created_atstring(date-time)required

        ISO 8601 date-time, in UTC.

      • updated_atstring(date-time)required

        ISO 8601 date-time, in UTC.

    • pathstringrequired

      The list URL without query.

    • per_pageintegerrequired

      Items per page.

    • next_cursorstringnullablerequired

      Cursor for the next page, or null.

    • next_page_urlstringnullablerequired

      URL of the next page, or null.

    • prev_cursorstringnullablerequired

      Cursor for the previous page, or null.

    • prev_page_urlstringnullablerequired

      URL of the previous page, or null.

  • 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.
    Errors
  • 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs: feature names the capability (the operation's x-feature) and required_tier the cheapest tier that grants it. Every operation answers this with "feature": "core.api" when no module the organization holds is on a tier that includes the API.
    Errors
  • 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (module_seat_required — an administrator assigns seats under Settings → Users), or the organization is suspended.
    Errors
  • 429The key has made more requests this minute than its limit allows.
    Errors

Create a recurrence

POST/recurrences
Scope write Module Scheduling & work orders Permission booking.work_orders.manage

Creates a standing agreement. Every night Closepact writes a work order (source recurrence, status booked, unassigned) for each date the rule produces from today up to lead_time_days ahead — never for dates in the past, and never twice for the same date. To see the jobs at once rather than tomorrow, call POST /recurrences/{recurrence}/generate.

The rule is checked when saved: an unsupported part is a 422 that names it. template.title is required. Ids in the body and the template must be your organization's.

curl -X POST 'https://api.closepact.com/v1/api/recurrences' \
  -H "Authorization: Bearer $CLOSEPACT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "account_id": "01a15c02-4e1a-7b3c-9d2e-5f60a7b8c901",
  "rrule": "FREQ=WEEKLY;INTERVAL=2;BYDAY=MO",
  "starts_on": "2026-11-02",
  "ends_on": "2027-06-28",
  "lead_time_days": 21,
  "template": {
    "title": "Trappstädning – Brf Linden, Storgatan 12",
    "service_address_id": "01a15c02-4e1c-7d5e-9f40-7182c9daeb23",
    "price_model": "fixed",
    "agreed_price_cents": 145000,
    "start_time": "06:30",
    "duration_minutes": 120
  }
}'
Response · 201
{
  "data": {
    "id": "01a15c30-6f70-7364-b5c6-d7e82f354189",
    "sub_entity_id": null,
    "account_id": "01a15c02-4e1a-7b3c-9d2e-5f60a7b8c901",
    "customer": {
      "id": "01a15c02-4e1a-7b3c-9d2e-5f60a7b8c901",
      "name": "Brf Linden",
      "customer_number": "10231"
    },
    "rrule": "FREQ=WEEKLY;INTERVAL=2;BYDAY=MO",
    "template": {
      "title": "Trappstädning – Brf Linden, Storgatan 12",
      "service_address_id": "01a15c02-4e1c-7d5e-9f40-7182c9daeb23",
      "price_model": "fixed",
      "agreed_price_cents": 145000,
      "start_time": "06:30",
      "duration_minutes": 120
    },
    "starts_on": "2026-11-02",
    "ends_on": "2027-06-28",
    "next_run_on": "2026-11-02",
    "status": "active",
    "lead_time_days": 21,
    "last_generated_at": null,
    "created_at": "2026-10-20T10:12:00+00:00",
    "updated_at": "2026-10-20T10:12:00+00:00"
  }
}

Request body

application/json · required

  • account_idstring(uuid)required

    The customer. Must be one of your organization's.

  • sub_entity_idstring(uuid)nullable

    The office (sub-entity) it belongs to. Must be one of yours.

  • rrulestringrequired

    The rule, e.g. FREQ=WEEKLY;INTERVAL=2;BYDAY=MO. A leading RRULE: is accepted. Supported: FREQ=DAILY|WEEKLY|MONTHLY, INTERVAL, BYDAY (MO…SU), COUNT, UNTIL (not both). Anything else is a 422 naming the part.

    at most 500 characters

  • templateobjectrequired

    What each generated job looks like. Only these keys exist; any other key is refused with 422 (a misspelt titel would otherwise be dropped silently).

  • starts_onstring(date)required

    First day. Calendar date, YYYY-MM-DD.

  • ends_onstring(date)nullable

    Last day, or null; not before starts_on. Calendar date, YYYY-MM-DD.

  • lead_time_daysinteger

    How far ahead to write jobs, 1–120 days. Default 14.

    1–120

  • statusstring

    active agreements write jobs; paused ones wait (a customer away for the summer); completed ones have run out — set by the generator when the rule produces no more dates, or by you.

    One ofactivepausedcompleted

Responses

  • Headers

    • X-RateLimit-Limit — Requests this key may make per minute.
    • X-RateLimit-Remaining — Requests left in the current minute.
    • dataobjectrequired

      A standing agreement (återkommande avtal) — "every other Monday, stairwell cleaning" — and the rule that writes its jobs.

      • idstring(uuid)required

        The recurrence id.

      • sub_entity_idstring(uuid)nullablerequired

        The office (sub-entity) it belongs to, and every job it writes; or null.

      • account_idstring(uuid)required

        The customer.

      • customerobjectnullablerequired

        The customer, or null where not loaded (the recurrence inside a generate result).

      • rrulestringrequired

        iCalendar recurrence rule (RFC 5545), limited to FREQ=DAILY|WEEKLY|MONTHLY, INTERVAL, BYDAY (MO…SU, no positions), COUNT and UNTIL. Weeks start on Monday.

      • templateobjectrequired

        What each generated job looks like. Only these keys exist; any other key is refused with 422 (a misspelt titel would otherwise be dropped silently).

      • starts_onstring(date)required

        First day of the agreement. Calendar date, YYYY-MM-DD.

      • ends_onstring(date)nullablerequired

        Last day, or null for open-ended. Calendar date, YYYY-MM-DD.

      • next_run_onstring(date)nullablerequired

        The next date the rule will write a job for, or null when it has run out. Calendar date, YYYY-MM-DD.

      • statusstringrequired

        active agreements write jobs; paused ones wait (a customer away for the summer); completed ones have run out — set by the generator when the rule produces no more dates, or by you.

        One ofactivepausedcompleted

      • lead_time_daysintegerrequired

        How far ahead jobs are written, in days (1–120).

      • last_generated_atstring(date-time)nullablerequired

        When jobs were last generated, or null.

      • created_atstring(date-time)required

        ISO 8601 date-time, in UTC.

      • updated_atstring(date-time)required

        ISO 8601 date-time, in UTC.

  • 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.
    Errors
  • 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs: feature names the capability (the operation's x-feature) and required_tier the cheapest tier that grants it. Every operation answers this with "feature": "core.api" when no module the organization holds is on a tier that includes the API.
    Errors
  • 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (module_seat_required — an administrator assigns seats under Settings → Users), or the organization is suspended.
    Errors
  • 422The request body or query failed validation.
    Errors
  • 429The key has made more requests this minute than its limit allows.
    Errors

Get a recurrence

GET/recurrences/{recurrence}

One standing agreement. The jobs it has written are work orders with source recurrence.

curl 'https://api.closepact.com/v1/api/recurrences/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40' \
  -H "Authorization: Bearer $CLOSEPACT_API_KEY"
Response · 200
{
  "data": {
    "id": "01a15c30-6f70-7364-b5c6-d7e82f354189",
    "sub_entity_id": null,
    "account_id": "01a15c02-4e1a-7b3c-9d2e-5f60a7b8c901",
    "customer": {
      "id": "01a15c02-4e1a-7b3c-9d2e-5f60a7b8c901",
      "name": "Brf Linden",
      "customer_number": "10231"
    },
    "rrule": "FREQ=WEEKLY;INTERVAL=2;BYDAY=MO",
    "template": {
      "title": "Trappstädning – Brf Linden, Storgatan 12",
      "service_address_id": "01a15c02-4e1c-7d5e-9f40-7182c9daeb23",
      "price_model": "fixed",
      "agreed_price_cents": 145000,
      "start_time": "06:30",
      "duration_minutes": 120
    },
    "starts_on": "2026-11-02",
    "ends_on": "2027-06-28",
    "next_run_on": "2026-11-30",
    "status": "active",
    "lead_time_days": 21,
    "last_generated_at": "2026-11-02T03:00:12+00:00",
    "created_at": "2026-10-20T10:12:00+00:00",
    "updated_at": "2026-11-02T03:00:12+00:00"
  }
}

Path parameters

  • recurrencestring(uuid)required

    The recurrence id.

Responses

  • Headers

    • X-RateLimit-Limit — Requests this key may make per minute.
    • X-RateLimit-Remaining — Requests left in the current minute.
    • dataobjectrequired

      A standing agreement (återkommande avtal) — "every other Monday, stairwell cleaning" — and the rule that writes its jobs.

      • idstring(uuid)required

        The recurrence id.

      • sub_entity_idstring(uuid)nullablerequired

        The office (sub-entity) it belongs to, and every job it writes; or null.

      • account_idstring(uuid)required

        The customer.

      • customerobjectnullablerequired

        The customer, or null where not loaded (the recurrence inside a generate result).

      • rrulestringrequired

        iCalendar recurrence rule (RFC 5545), limited to FREQ=DAILY|WEEKLY|MONTHLY, INTERVAL, BYDAY (MO…SU, no positions), COUNT and UNTIL. Weeks start on Monday.

      • templateobjectrequired

        What each generated job looks like. Only these keys exist; any other key is refused with 422 (a misspelt titel would otherwise be dropped silently).

      • starts_onstring(date)required

        First day of the agreement. Calendar date, YYYY-MM-DD.

      • ends_onstring(date)nullablerequired

        Last day, or null for open-ended. Calendar date, YYYY-MM-DD.

      • next_run_onstring(date)nullablerequired

        The next date the rule will write a job for, or null when it has run out. Calendar date, YYYY-MM-DD.

      • statusstringrequired

        active agreements write jobs; paused ones wait (a customer away for the summer); completed ones have run out — set by the generator when the rule produces no more dates, or by you.

        One ofactivepausedcompleted

      • lead_time_daysintegerrequired

        How far ahead jobs are written, in days (1–120).

      • last_generated_atstring(date-time)nullablerequired

        When jobs were last generated, or null.

      • created_atstring(date-time)required

        ISO 8601 date-time, in UTC.

      • updated_atstring(date-time)required

        ISO 8601 date-time, in UTC.

  • 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.
    Errors
  • 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs: feature names the capability (the operation's x-feature) and required_tier the cheapest tier that grants it. Every operation answers this with "feature": "core.api" when no module the organization holds is on a tier that includes the API.
    Errors
  • 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (module_seat_required — an administrator assigns seats under Settings → Users), or the organization is suspended.
    Errors
  • 404No such record in this organization.
    Errors
  • 429The key has made more requests this minute than its limit allows.
    Errors

Update a recurrence

PATCH/recurrences/{recurrence}
Scope write Module Scheduling & work orders Permission booking.work_orders.manage

Changes the agreement. template is merged into the stored template: send only the keys to change, and a key set to null to remove it. Changing rrule, starts_on or ends_on recomputes next_run_on.

Jobs already written are left alone — they may be assigned or already worked on. Move or cancel the ones the change makes wrong; pause the agreement with status: paused.

curl -X PATCH 'https://api.closepact.com/v1/api/recurrences/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40' \
  -H "Authorization: Bearer $CLOSEPACT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "status": "paused",
  "template": {
    "start_time": "07:00"
  }
}'
Response · 200
{
  "data": {
    "id": "01a15c30-6f70-7364-b5c6-d7e82f354189",
    "sub_entity_id": null,
    "account_id": "01a15c02-4e1a-7b3c-9d2e-5f60a7b8c901",
    "customer": {
      "id": "01a15c02-4e1a-7b3c-9d2e-5f60a7b8c901",
      "name": "Brf Linden",
      "customer_number": "10231"
    },
    "rrule": "FREQ=WEEKLY;INTERVAL=2;BYDAY=MO",
    "template": {
      "title": "Trappstädning – Brf Linden, Storgatan 12",
      "service_address_id": "01a15c02-4e1c-7d5e-9f40-7182c9daeb23",
      "price_model": "fixed",
      "agreed_price_cents": 145000,
      "start_time": "07:00",
      "duration_minutes": 120
    },
    "starts_on": "2026-11-02",
    "ends_on": "2027-06-28",
    "next_run_on": "2026-11-30",
    "status": "paused",
    "lead_time_days": 21,
    "last_generated_at": "2026-11-02T03:00:12+00:00",
    "created_at": "2026-10-20T10:12:00+00:00",
    "updated_at": "2026-11-10T08:00:00+00:00"
  }
}

Path parameters

  • recurrencestring(uuid)required

    The recurrence id.

Request body

application/json · required

  • account_idstring(uuid)

    The customer. Must be one of your organization's.

  • sub_entity_idstring(uuid)nullable

    The office (sub-entity) it belongs to. Must be one of yours.

  • rrulestring

    The rule, e.g. FREQ=WEEKLY;INTERVAL=2;BYDAY=MO. A leading RRULE: is accepted. Supported: FREQ=DAILY|WEEKLY|MONTHLY, INTERVAL, BYDAY (MO…SU), COUNT, UNTIL (not both). Anything else is a 422 naming the part.

    at most 500 characters

  • starts_onstring(date)

    First day. Calendar date, YYYY-MM-DD.

  • ends_onstring(date)nullable

    Last day, or null; not before starts_on. Calendar date, YYYY-MM-DD.

  • lead_time_daysinteger

    How far ahead to write jobs, 1–120 days. Default 14.

    1–120

  • statusstring

    active agreements write jobs; paused ones wait (a customer away for the summer); completed ones have run out — set by the generator when the rule produces no more dates, or by you.

    One ofactivepausedcompleted

  • templateobject

    Keys to change in the template; the others are kept. Sending null removes a key that may be empty (description, contact_id, service_address_id, agreed_price_cents, rot_rut_share, estimated_minutes). The result must still have a title.

Responses

  • Headers

    • X-RateLimit-Limit — Requests this key may make per minute.
    • X-RateLimit-Remaining — Requests left in the current minute.
    • dataobjectrequired

      A standing agreement (återkommande avtal) — "every other Monday, stairwell cleaning" — and the rule that writes its jobs.

      • idstring(uuid)required

        The recurrence id.

      • sub_entity_idstring(uuid)nullablerequired

        The office (sub-entity) it belongs to, and every job it writes; or null.

      • account_idstring(uuid)required

        The customer.

      • customerobjectnullablerequired

        The customer, or null where not loaded (the recurrence inside a generate result).

      • rrulestringrequired

        iCalendar recurrence rule (RFC 5545), limited to FREQ=DAILY|WEEKLY|MONTHLY, INTERVAL, BYDAY (MO…SU, no positions), COUNT and UNTIL. Weeks start on Monday.

      • templateobjectrequired

        What each generated job looks like. Only these keys exist; any other key is refused with 422 (a misspelt titel would otherwise be dropped silently).

      • starts_onstring(date)required

        First day of the agreement. Calendar date, YYYY-MM-DD.

      • ends_onstring(date)nullablerequired

        Last day, or null for open-ended. Calendar date, YYYY-MM-DD.

      • next_run_onstring(date)nullablerequired

        The next date the rule will write a job for, or null when it has run out. Calendar date, YYYY-MM-DD.

      • statusstringrequired

        active agreements write jobs; paused ones wait (a customer away for the summer); completed ones have run out — set by the generator when the rule produces no more dates, or by you.

        One ofactivepausedcompleted

      • lead_time_daysintegerrequired

        How far ahead jobs are written, in days (1–120).

      • last_generated_atstring(date-time)nullablerequired

        When jobs were last generated, or null.

      • created_atstring(date-time)required

        ISO 8601 date-time, in UTC.

      • updated_atstring(date-time)required

        ISO 8601 date-time, in UTC.

  • 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.
    Errors
  • 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs: feature names the capability (the operation's x-feature) and required_tier the cheapest tier that grants it. Every operation answers this with "feature": "core.api" when no module the organization holds is on a tier that includes the API.
    Errors
  • 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (module_seat_required — an administrator assigns seats under Settings → Users), or the organization is suspended.
    Errors
  • 404No such record in this organization.
    Errors
  • 422The request body or query failed validation.
    Errors
  • 429The key has made more requests this minute than its limit allows.
    Errors

Delete a recurrence

DELETE/recurrences/{recurrence}
Scope write Module Scheduling & work orders Permission booking.work_orders.manage

Deletes the agreement. The jobs it wrote are kept, so work done under it can still be invoiced; they simply stop pointing at it. To stop an agreement for a while, pause it instead.

curl -X DELETE 'https://api.closepact.com/v1/api/recurrences/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40' \
  -H "Authorization: Bearer $CLOSEPACT_API_KEY"
Response · 200
{
  "deleted": true
}

Path parameters

  • recurrencestring(uuid)required

    The recurrence id.

Responses

  • Headers

    • X-RateLimit-Limit — Requests this key may make per minute.
    • X-RateLimit-Remaining — Requests left in the current minute.
    • deletedbooleanrequired

      One oftrue

  • 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.
    Errors
  • 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs: feature names the capability (the operation's x-feature) and required_tier the cheapest tier that grants it. Every operation answers this with "feature": "core.api" when no module the organization holds is on a tier that includes the API.
    Errors
  • 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (module_seat_required — an administrator assigns seats under Settings → Users), or the organization is suspended.
    Errors
  • 404No such record in this organization.
    Errors
  • 429The key has made more requests this minute than its limit allows.
    Errors

Generate jobs now

POST/recurrences/{recurrence}/generate
Scope write Module Scheduling & work orders Permission booking.work_orders.manage

Runs the nightly generator for this agreement now: writes a work order for every date from today to the horizon (today + lead_time_days, or ends_on if earlier) that does not have one yet, at most 200 per run. Safe to repeat — dates that already have a job, including ones deleted on purpose, are counted as skipped, never written twice.

With dry_run=true nothing is written: dates shows what would be considered and created is 0. A run updates last_generated_at and next_run_on, and marks the agreement completed when its rule has no dates left. Only an active agreement can be generated (409 otherwise).

curl -X POST 'https://api.closepact.com/v1/api/recurrences/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40/generate' \
  -H "Authorization: Bearer $CLOSEPACT_API_KEY"
Response
{
  "data": {
    "created": 2,
    "skipped": 0,
    "horizon": "2026-11-23",
    "dates": [
      "2026-11-02",
      "2026-11-16"
    ],
    "work_orders": [
      {
        "id": "01a15c31-7081-7475-86d7-e8f9304652a1",
        "order_number": "1051",
        "title": "Trappstädning – Brf Linden, Storgatan 12",
        "occurrence_date": "2026-11-02",
        "planned_start": "2026-11-02T05:30:00+00:00"
      },
      {
        "id": "01a15c31-7082-7586-97e8-f90a415763b2",
        "order_number": "1052",
        "title": "Trappstädning – Brf Linden, Storgatan 12",
        "occurrence_date": "2026-11-16",
        "planned_start": "2026-11-16T05:30:00+00:00"
      }
    ],
    "recurrence": {
      "id": "01a15c30-6f70-7364-b5c6-d7e82f354189",
      "sub_entity_id": null,
      "account_id": "01a15c02-4e1a-7b3c-9d2e-5f60a7b8c901",
      "customer": null,
      "rrule": "FREQ=WEEKLY;INTERVAL=2;BYDAY=MO",
      "template": {
        "title": "Trappstädning – Brf Linden, Storgatan 12",
        "service_address_id": "01a15c02-4e1c-7d5e-9f40-7182c9daeb23",
        "price_model": "fixed",
        "agreed_price_cents": 145000,
        "start_time": "06:30",
        "duration_minutes": 120
      },
      "starts_on": "2026-11-02",
      "ends_on": "2027-06-28",
      "next_run_on": "2026-11-30",
      "status": "active",
      "lead_time_days": 21,
      "last_generated_at": "2026-11-02T08:14:00+00:00",
      "created_at": "2026-10-20T10:12:00+00:00",
      "updated_at": "2026-11-02T08:14:00+00:00"
    }
  }
}

Path parameters

  • recurrencestring(uuid)required

    The recurrence id.

Query parameters

  • dry_runboolean

    true to see the dates without writing anything. May also be sent in the body.

    Default false

Responses

  • Headers

    • X-RateLimit-Limit — Requests this key may make per minute.
    • X-RateLimit-Remaining — Requests left in the current minute.
    • dataobjectrequired

      The result of running the generator for one agreement.

      • createdintegerrequired

        Jobs written by this run. 0 for a dry run.

      • skippedintegerrequired

        Dates that already had a job (written by an earlier run, or deleted on purpose).

      • horizonstring(date)required

        The last date this run looked at: today plus lead_time_days, or ends_on if earlier. Calendar date, YYYY-MM-DD.

      • datesarray of strings(date)required

        Every date from today to the horizon the rule produces (at most 200), whether written now or before.

      • work_ordersarray of objectsrequired

        The jobs written by this run.

      • recurrenceobjectrequired

        A standing agreement (återkommande avtal) — "every other Monday, stairwell cleaning" — and the rule that writes its jobs.

  • 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.
    Errors
  • 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs: feature names the capability (the operation's x-feature) and required_tier the cheapest tier that grants it. Every operation answers this with "feature": "core.api" when no module the organization holds is on a tier that includes the API.
    Errors
  • 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (module_seat_required — an administrator assigns seats under Settings → Users), or the organization is suspended.
    Errors
  • 404No such record in this organization.
    Errors
  • Errors
  • 422The request body or query failed validation.
    Errors
  • 429The key has made more requests this minute than its limit allows.
    Errors