> ## Documentation Index
> Fetch the complete documentation index at: https://docs.jobin.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# List Operations

> Read bounded, tenant-scoped operational metadata for persisted JobinJobs.

`GET /operations` lists persisted JobinJob operations visible to the authenticated API user. The
default filter is exactly `status=pending`; other persisted states such as `processing`,
`THROTTLED`, and `QUOTA_REACHED` are distinct and can be requested explicitly.

The query accepts repeated `status` and `codename` parameters, plus `queue`, `jobGroupId`,
`campaignId`, `contactId`, `userLinkedinUrl`, `page`, and `limit`. Page numbers start at 1 and are
capped at 100. The result limit defaults to 25 and cannot exceed 25.

For example, inspect pending LinkedIn invitations:

```http theme={null}
GET /api/openapi/v1/operations?status=pending&codename=sendLinkedinInvite&page=1&limit=25
```

The response contains safe operational metadata only. It omits worker payloads and internal retry
state and does not consume Jobin credits. `count` is the number of items on the returned page. `total` is the exact matching count under
the same workgroup and sender visibility rules, regardless of page or limit.

Use `jobGroupId` to correlate an asynchronous campaign assignment with currently outstanding
operations:

```http theme={null}
GET /api/openapi/v1/operations?jobGroupId=<jobGroupId>
```

No matching pending operations does not prove that the earlier assignment succeeded: jobs may have
completed, failed, changed lifecycle state, or moved to a later sequence stage.


## OpenAPI

````yaml openapi/jobin-integration.json GET /operations
openapi: 3.1.0
info:
  title: Jobin Integration API
  version: 1.0.0
  description: >-
    Public Jobin OpenAPI contract for API-key authentication, contact
    enrichment, and sequence orchestration. Use the base URL below and append
    the documented path suffixes. Rate limits: API key validation 30/minute,
    reads 120/minute, writes 30/minute, and enrichment/campaign/message actions
    10/minute per API identity.
servers:
  - url: https://my.jobin.cloud/api/openapi/v1
    description: Public OpenAPI base URL. Append each path below to this base URL.
security: []
paths:
  /operations:
    get:
      summary: List Jobin operations
      description: >-
        Lists safe operational metadata for persisted JobinJobs. Defaults to the
        exact persisted pending status. Results are limited to the authenticated
        workgroup and sender visibility rules. A missing pending operation does
        not prove that earlier work succeeded.
      parameters:
        - name: status
          in: query
          style: form
          explode: true
          description: >-
            Repeat to request multiple persisted JobinJob states. Defaults to
            pending.
          schema:
            type: array
            items:
              type: string
              enum:
                - fail
                - success
                - pending
                - processing
                - blocked
                - paused
                - OUT_OF_TIMEFRAME
                - THROTTLED
                - SYNCHRONIZING
                - COMPILING_SMART_FIELDS
                - PENDING_HYDRATION
                - UPSELL
                - QUOTA_REACHED
                - DISABLED
            default:
              - pending
        - name: codename
          in: query
          style: form
          explode: true
          description: >-
            Repeat to filter by one or more operation codenames, such as
            sendLinkedinInvite.
          schema:
            type: array
            items:
              type: string
        - name: queue
          in: query
          schema:
            type: string
            enum:
              - linkedin
              - email
              - sms
              - jobin
        - name: jobGroupId
          in: query
          schema:
            type: string
            pattern: ^[a-fA-F0-9]{24}$
        - name: campaignId
          in: query
          schema:
            type: string
            pattern: ^[a-fA-F0-9]{24}$
        - name: contactId
          in: query
          schema:
            type: string
            pattern: ^[a-fA-F0-9]{24}$
        - name: userLinkedinUrl
          in: query
          schema:
            type: string
            format: uri
        - name: page
          in: query
          schema:
            type: integer
            minimum: 1
            default: 1
            maximum: 100
        - name: limit
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 25
            default: 25
      responses:
        '200':
          description: Bounded operations page
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OperationsListResponse'
              example:
                items:
                  - id: aaaaaaaaaaaaaaaaaaaaaaaa
                    jobGroupId: bbbbbbbbbbbbbbbbbbbbbbbb
                    queue: linkedin
                    codename: sendLinkedinInvite
                    title: Send LinkedIn invitation
                    status: pending
                    contactId: cccccccccccccccccccccccc
                    campaignId: dddddddddddddddddddddddd
                    sender:
                      type: linkedin
                      id: https://www.linkedin.com/in/sender
                    createdAt: '2026-09-28T10:00:00.000Z'
                    updatedAt: '2026-09-28T10:00:00.000Z'
                page: 1
                limit: 25
                count: 1
                total: 1
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    OperationsListResponse:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/JobinOperation'
        page:
          type: integer
        limit:
          type: integer
        count:
          type: integer
          description: Number of items returned on this page.
        total:
          type: integer
          description: >-
            Exact number of matching persisted operations under the same
            workgroup, sender visibility, and filter rules, independent of page
            and limit.
      required:
        - items
        - page
        - limit
        - count
        - total
      additionalProperties: false
    JobinOperation:
      type: object
      description: >-
        Safe operational metadata for a persisted JobinJob. Worker payload,
        retry internals, and raw Mongo references are omitted.
      properties:
        id:
          type: string
        jobGroupId:
          type: string
        queue:
          type: string
          enum:
            - linkedin
            - email
            - sms
            - jobin
        codename:
          type: string
        title:
          type: string
        status:
          type: string
          enum:
            - fail
            - success
            - pending
            - processing
            - blocked
            - paused
            - OUT_OF_TIMEFRAME
            - THROTTLED
            - SYNCHRONIZING
            - COMPILING_SMART_FIELDS
            - PENDING_HYDRATION
            - UPSELL
            - QUOTA_REACHED
            - DISABLED
        contactId:
          type: string
        campaignId:
          type: string
        stagePositionCode:
          type: string
        sender:
          $ref: '#/components/schemas/JobinOperationSender'
        nextRunAt:
          type:
            - string
            - 'null'
          format: date-time
        throttledUntil:
          type: string
          format: date-time
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
      required:
        - id
        - queue
        - codename
        - title
        - status
        - createdAt
        - updatedAt
      additionalProperties: false
    RateLimitError:
      type: object
      description: Returned when a public OpenAPI rate limit is exceeded.
      properties:
        statusCode:
          type: integer
          example: 429
        error:
          type: string
          example: Too Many Requests
        message:
          type: string
          description: Human-readable description of the limit that was exceeded.
        retryAfterSeconds:
          type: integer
          description: Seconds to wait before retrying the request.
    JobinOperationSender:
      type: object
      properties:
        type:
          type: string
          enum:
            - linkedin
            - email
            - sms
        id:
          type: string
          description: Sender URL for LinkedIn or sender ObjectId for email/SMS.
      required:
        - type
        - id
      additionalProperties: false
  responses:
    RateLimitExceeded:
      description: >-
        Rate limit exceeded. Wait for the retry-after header before sending the
        next request.
      headers:
        retry-after:
          description: Seconds to wait before retrying.
          schema:
            type: integer
        x-ratelimit-limit:
          description: Maximum requests allowed in the current window.
          schema:
            type: integer
        x-ratelimit-remaining:
          description: Requests remaining in the current window.
          schema:
            type: integer
        x-ratelimit-reset:
          description: Seconds until the current window resets.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RateLimitError'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Primary public authentication method. Create keys in Jobin.cloud under
        Workgroups > Integrations > Custom integration.

````