ET Ducky API

ET Ducky API as documented publicly: 28 operations. Contract generated from the documentation by API Evangelist (2026-11-07); not the provider's own document.

GitHub OpenAPI

Operations 28

GET / GET / #
PUT / PUT / #
POST /ATServicesRest/V1.0/TimeEntries Create a time entry in Autotask #
POST /api/Actions Log time as an action on a ticket in HaloPSA #
POST /api/alerts/rules/from-template/{templateid} Built-in Rule Templates #
GET /api/alerts/templates Built-in Rule Templates #
POST /api/events/batch Agent event uploads #
POST /api/events/correlated Agent event uploads #
GET /api/file-hub/jwks.json Cloud Public keys (JWKS) hubs use to verify grant tokens. #
POST /api/file-hub/mount-keys/validate Cloud Hub validates a presented mount key (cached) and gets back its per-path scope. #
POST /api/file-hub/register Cloud Hub registers its LAN endpoint + cert fingerprint and syncs config/manifest. #
POST /api/files/initiate-direct POST /api/files/initiate-direct #
POST /api/isolation/lift-code POST /api/isolation/lift-code #
POST /api/now/table/incident Auto-open a ServiceNow or Jira incident #
GET /api/v1/agents The organization's agents, sorted by hostname. #
GET /api/v1/agents/{agentid} One agent, its latest health sample and its number of active alerts. #
GET /api/v1/alerts Alerts raised for the organization's agents, newest first. #
GET /api/v1/device-context The agents matching one device name or agent id, each with its latest health sample, its active alerts and dashboard links. #
GET /api/v1/summary Agent counts by state and OS, and active alerts by severity. #
DELETE /blob/{blobId} Hub Remove a blob (delete grant, Bearer). #
GET /blob/{blobId} Hub Download a blob by id (read grant, Bearer). #
PUT /blob/{blobId} Hub Publish a blob by id (write grant, Bearer). #
GET /downloads/ETDuckyAgentSetup.exe Download the ETDucky agent installer. #
GET /health Health endpoint that answers 200 while the server is running. #
GET /install.sh Download the ET Ducky installer script #
GET /ready Health endpoint that checks database connections and services, returning 503 when unhealthy. #
POST /rest/api/3/issue Auto-open a ServiceNow or Jira incident #
POST /v4_6_release/apis/3.0/time/entries Create a time entry in ConnectWise Manage #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/etducky-com:etducky-com-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

etducky-com-openapi-generated.yml Raw ↑
openapi: 3.1.0
info:
  title: ET Ducky API
  version: '2026-11-07'
  description: 'GENERATED FROM DOCUMENTATION by API Evangelist on 2026-11-07: 28 operation(s) read from 37 public documentation page(s) (each
    operation names its page in x-source). This is not the provider''s published contract; ET Ducky has published no machine-readable contract
    that the pipeline could find. Engine: local.'
  x-evidence-tiers:
    code-example: 4
    documentation: 24
    pages-with-code: 31
    pages-read: 37
  x-generated-from: documentation
  x-provenance: generated
  x-authored-by: API Evangelist
  x-generated: '2026-11-07'
  x-generator: generate-contract-from-docs.py
  x-engine: local
  x-sources:
  - https://etducky.com/documentation/api
  - https://etducky.com/documentation/distribution-servers-api
  - https://etducky.com/integrations/psa
  - https://etducky.com/documentation/api-rate-limits
  - https://apidocs.etducky.com
  - https://api-docs.etducky.com
  - https://etducky.com/documentation/agent-setup
  - https://etducky.com/documentation/alerts
  - https://etducky.com/documentation/features
  - https://etducky.com/documentation/linux-agent
  - https://etducky.com/documentation/psa-billing
  - https://etducky.com/documentation/self-hosted
  - https://etducky.com/documentation/ticketing-integrations
  - https://etducky.com/integrations/security
  - https://etducky.com/integrations/ticketing
  - https://etducky.com/integrations/script-repos
  - https://etducky.com/integrations/distribution
  - https://apidocs.etducky.com/agents
  - https://apidocs.etducky.com/reports
  - https://apidocs.etducky.com/alerts
  - https://apidocs.etducky.com/tickets
  - https://apidocs.etducky.com/automations
  - https://apidocs.etducky.com/systems
  - https://apidocs.etducky.com/integrations
  - https://apidocs.etducky.com/configuration
  - https://apidocs.etducky.com/settings
  - https://apidocs.etducky.com/documentation/alerts
  - https://apidocs.etducky.com/documentation/ticketing-integrations
  - https://apidocs.etducky.com/documentation/self-hosted
  - https://apidocs.etducky.com/documentation/linux-agent
  - https://apidocs.etducky.com/configuration/subscriptions
  - https://apidocs.etducky.com/configuration/ai
  - https://apidocs.etducky.com/configuration/agents
  - https://apidocs.etducky.com/configuration/workspace
  - https://apidocs.etducky.com/configuration/time
  - https://apidocs.etducky.com/systems/tickets
  - https://apidocs.etducky.com/systems/alerts
servers:
- url: https://<workspace>.etducky.com/api/v1 or https://etducky.com/api/v1
paths:
  /:
    get:
      operationId: get
      tags:
      - Api
      summary: GET /
      x-source: https://etducky.com/documentation/api
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -H \"Authorization: Bearer etd_api_...\"  \"https://<workspace>.etducky.com/api/v1/agents?os=windows&online=false\" \n\
          \ Responses are JSON with camelCase field names. Timestamps are UTC in ISO 8601 form with a Z suffix. An agent is online when it has\
          \ sent a heartbeat in the last 5 minutes. Deleted agents are never returned. \n Endpoints \n Method and path Returns \n GET /api/v1/agents\
          \ The organization"
    put:
      operationId: put
      tags:
      - Api
      summary: PUT /
      x-source: https://etducky.com/documentation/distribution-servers-api
      responses:
        '200':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PutResponse'
      x-evidence:
        kind: code-example
        language: curl
        snippet: 'curl -k -X PUT "https://<hub-ip>:8443/blob/<fresh-guid>"  -H "Authorization: Bearer <GRANT_JWT>"  -H "Content-Type: text/plain"  --data-binary
          "@hello.txt"'
  /ATServicesRest/V1.0/TimeEntries:
    post:
      operationId: post_ATServicesRest_V1_0_TimeEntries
      tags:
      - Atservicesrest
      summary: Create a time entry in Autotask
      description: 'Create the entry with POST /ATServicesRest/V1.0/TimeEntries. Auth: an API-User security-level account; send UserName, Secret,
        and your ApiIntegrationCode headers.'
      x-source: https://etducky.com/documentation/psa-billing
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/Actions:
    post:
      operationId: post_api_Actions
      tags:
      - Api
      summary: Log time as an action on a ticket in HaloPSA
      description: 'Log time as an action on the ticket with POST /api/Actions. Auth: OAuth2 client-credentials — exchange a client id/secret
        for a bearer token, then call the API with it.'
      x-source: https://etducky.com/documentation/psa-billing
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/alerts/rules/from-template/{templateid}:
    post:
      operationId: post_api_alerts_rules_from_template_templateid
      tags:
      - Api
      summary: Built-in Rule Templates
      x-source: https://etducky.com/documentation/alerts
      parameters:
      - name: templateid
        in: path
        required: true
        schema:
          type: string
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/alerts/templates:
    get:
      operationId: get_api_alerts_templates
      tags:
      - Api
      summary: Built-in Rule Templates
      x-source: https://etducky.com/documentation/alerts
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/events/batch:
    post:
      operationId: post_api_events_batch
      tags:
      - Api
      summary: Agent event uploads
      description: Agents upload events once a minute. Each agent may make 600 upload requests a minute, with a burst of up to 1,200, counted
        across POST /api/events/batch and POST /api/events/correlated. The request body is accepted up to 16 MiB and may be gzip‑compressed.
      x-source: https://etducky.com/documentation/api-rate-limits
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/events/correlated:
    post:
      operationId: post_api_events_correlated
      tags:
      - Api
      summary: Agent event uploads
      description: Agents upload correlated summaries inside the event upload request. The request body is accepted up to 16 MiB and may be gzip‑compressed.
      x-source: https://etducky.com/documentation/api-rate-limits
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/file-hub/jwks.json:
    get:
      operationId: get_api_file_hub_jwks_json
      tags:
      - Api
      summary: Cloud Public keys (JWKS) hubs use to verify grant tokens.
      x-source: https://etducky.com/documentation/distribution-servers-api
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/file-hub/mount-keys/validate:
    post:
      operationId: post_api_file_hub_mount_keys_validate
      tags:
      - Api
      summary: Cloud Hub validates a presented mount key (cached) and gets back its per-path scope.
      x-source: https://etducky.com/documentation/distribution-servers-api
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostApiFileHubMountKeysValidateRequest'
      responses:
        '201':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostApiFileHubMountKeysValidateResponse'
      x-evidence:
        kind: documentation
  /api/file-hub/register:
    post:
      operationId: post_api_file_hub_register
      tags:
      - Api
      summary: Cloud Hub registers its LAN endpoint + cert fingerprint and syncs config/manifest.
      x-source: https://etducky.com/documentation/distribution-servers-api
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/files/initiate-direct:
    post:
      operationId: post_api_files_initiate_direct
      tags:
      - Api
      summary: POST /api/files/initiate-direct
      x-source: https://etducky.com/documentation/distribution-servers-api
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostApiFilesInitiateDirectRequest'
      responses:
        '201':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostApiFilesInitiateDirectResponse'
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -s -X POST \"https://etducky.com/api/files/initiate-direct\"  -H \"Authorization: Bearer <CLERK_SESSION_JWT>\"  -H \"Content-Type:\
          \ application/json\"  -d '{\"connectionId\":\"<conn>\",\"path\":\"/installers/hello.txt\",\"action\":\"write\",\"sizeBytes\":12}' \n\
          \ 2. PUT the bytes to the hub \n For a brand-new path the grant carries no blob_id , so the caller chooses the blob id (a fresh GUID).\
          \ The grant goes in the "
  /api/isolation/lift-code:
    post:
      operationId: post_api_isolation_lift_code
      tags:
      - Api
      summary: POST /api/isolation/lift-code
      x-source: https://etducky.com/documentation/agent-setup
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostApiIsolationLiftCodeRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -X POST http://127.0.0.1:51902/api/isolation/lift-code  -H 'Content-Type: application/json'  -d '{\"code\":\"XXXXXXXX\"\
          }' \nThe code is HMAC-derived from the agent's bearer token, valid within a 10-minute window, single-use. Verified entirely on-device;\
          \ no internet connectivity required to authenticate. \n Delete + reinstall. If the server is unreachable and no lift code is available,\
          \ delete the ag"
  /api/now/table/incident:
    post:
      operationId: post_api_now_table_incident
      tags:
      - Api
      summary: Auto-open a ServiceNow or Jira incident
      x-source: https://etducky.com/documentation/ticketing-integrations
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/v1/agents:
    get:
      operationId: get_api_v1_agents
      tags:
      - Api
      summary: The organization's agents, sorted by hostname.
      description: Returns the organization's agents with optional filtering.
      x-source: https://etducky.com/documentation/api
      parameters:
      - name: search
        in: query
        required: false
        schema:
          type: string
        description: Part of the hostname, case-insensitive.
      - name: os
        in: query
        required: false
        schema:
          type: string
        description: windows, linux or other. other covers agents with no recognised OS. Any other value is answered 400.
      - name: online
        in: query
        required: false
        schema:
          type: string
        description: true for agents with a heartbeat in the last 5 minutes, false for the rest.
      - name: tag
        in: query
        required: false
        schema:
          type: string
        description: Only agents carrying this exact tag name.
      - name: limit
        in: query
        required: false
        schema:
          type: string
        description: Most agents to return, 1 to 500. Defaults to 100. A value outside that range is clamped to it.
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiV1AgentsResponse'
      x-evidence:
        kind: documentation
  /api/v1/agents/{agentid}:
    get:
      operationId: get_api_v1_agents_agentid
      tags:
      - Api
      summary: One agent, its latest health sample and its number of active alerts.
      description: Returns details for a single agent.
      x-source: https://etducky.com/documentation/api
      parameters:
      - name: agentid
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiV1AgentsAgentidResponse'
      x-evidence:
        kind: documentation
  /api/v1/alerts:
    get:
      operationId: get_api_v1_alerts
      tags:
      - Api
      summary: Alerts raised for the organization's agents, newest first.
      description: Returns alerts with optional filtering.
      x-source: https://etducky.com/documentation/api
      parameters:
      - name: status
        in: query
        required: false
        schema:
          type: string
        description: active (the default), acknowledged, resolved, auto_resolved, suppressed, or any for no status filter. Any other value is
          answered 400.
      - name: severity
        in: query
        required: false
        schema:
          type: string
        description: Only alerts of this severity, for example critical or warning.
      - name: agentId
        in: query
        required: false
        schema:
          type: string
        description: Only alerts for this agent.
      - name: sinceHours
        in: query
        required: false
        schema:
          type: string
        description: 'How far back to look, by the time the alert was raised: 1 to 720 hours. Defaults to 168 (7 days). A value outside that range
          is clamped to it.'
      - name: limit
        in: query
        required: false
        schema:
          type: string
        description: Most alerts to return, 1 to 500. Defaults to 100.
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiV1AlertsResponse'
      x-evidence:
        kind: documentation
  /api/v1/device-context:
    get:
      operationId: get_api_v1_device_context
      tags:
      - Api
      summary: The agents matching one device name or agent id, each with its latest health sample, its active alerts and dashboard links.
      description: Returns detailed context for a device.
      x-source: https://etducky.com/documentation/api
      parameters:
      - name: hostname
        in: query
        required: false
        schema:
          type: string
        description: The device name, case‑insensitive. One of hostname or agentId is required.
      - name: agentId
        in: query
        required: false
        schema:
          type: string
        description: An agent id. When given, hostname is ignored.
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiV1DeviceContextResponse'
      x-evidence:
        kind: documentation
  /api/v1/summary:
    get:
      operationId: get_api_v1_summary
      tags:
      - Api
      summary: Agent counts by state and OS, and active alerts by severity.
      description: Provides a fleet summary.
      x-source: https://etducky.com/documentation/api
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiV1SummaryResponse'
      x-evidence:
        kind: documentation
  /blob/{blobId}:
    delete:
      operationId: delete_blob_blobId
      tags:
      - Blob
      summary: Hub Remove a blob (delete grant, Bearer).
      x-source: https://etducky.com/documentation/distribution-servers-api
      parameters:
      - name: blobId
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
    get:
      operationId: get_blob_blobId
      tags:
      - Blob
      summary: Hub Download a blob by id (read grant, Bearer).
      x-source: https://etducky.com/documentation/distribution-servers-api
      parameters:
      - name: blobId
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
    put:
      operationId: put_blob_blobId
      tags:
      - Blob
      summary: Hub Publish a blob by id (write grant, Bearer).
      x-source: https://etducky.com/documentation/distribution-servers-api
      parameters:
      - name: blobId
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PutBlobBlobidResponse'
      x-evidence:
        kind: documentation
  /downloads/ETDuckyAgentSetup.exe:
    get:
      operationId: get_downloads_ETDuckyAgentSetup_exe
      tags:
      - Downloads
      summary: Download the ETDucky agent installer.
      x-source: https://etducky.com/documentation/self-hosted
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /health:
    get:
      operationId: get_health
      tags:
      - Health
      summary: Health endpoint that answers 200 while the server is running.
      x-source: https://etducky.com/documentation/self-hosted
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /install.sh:
    get:
      operationId: get_install_sh
      tags:
      - Install
      summary: Download the ET Ducky installer script
      description: Retrieves the install.sh script used to install the ET Ducky agent.
      x-source: https://etducky.com/integrations/psa
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /ready:
    get:
      operationId: get_ready
      tags:
      - Ready
      summary: Health endpoint that checks database connections and services, returning 503 when unhealthy.
      x-source: https://etducky.com/documentation/self-hosted
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /rest/api/3/issue:
    post:
      operationId: post_rest_api_3_issue
      tags:
      - Rest
      summary: Auto-open a ServiceNow or Jira incident
      x-source: https://etducky.com/documentation/ticketing-integrations
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v4_6_release/apis/3.0/time/entries:
    post:
      operationId: post_v4_6_release_apis_3_0_time_entries
      tags:
      - V4 6 Release
      summary: Create a time entry in ConnectWise Manage
      description: 'Create the entry with POST /v4_6_release/apis/3.0/time/entries. Auth: a dedicated API member with a public/private key pair;
        authenticate as companyId+publicKey : privateKey (Basic) with a clientId header.'
      x-source: https://etducky.com/documentation/psa-billing
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
components:
  schemas:
    PutResponse:
      type: object
      properties:
        blobId:
          type: string
        sha256:
          type: string
        sizeBytes:
          type: integer
    PostApiFileHubMountKeysValidateRequest:
      type: object
      properties:
        keyId:
          type: string
        secret:
          type: string
      required:
      - keyId
      - secret
    PostApiFileHubMountKeysValidateResponse:
      type: object
      properties:
        connId:
          type: string
        hubId:
          type: string
        paths:
          type: array
        expiresAt:
          type: string
    PostApiFilesInitiateDirectRequest:
      type: object
      properties:
        connectionId:
          type: string
        path:
          type: string
        action:
          type: string
        sizeBytes:
          type: integer
    PostApiFilesInitiateDirectResponse:
      type: object
      properties:
        blobId:
          type: string
        sha256:
          type: string
        sizeBytes:
          type: integer
    PostApiIsolationLiftCodeRequest:
      type: object
      properties:
        code:
          type: string
    GetApiV1AgentsResponse:
      type: object
      properties:
        agents:
          type: array
          description: List of agent objects.
        total:
          type: integer
          description: Counts every agent that matches the filters.
        truncated:
          type: boolean
          description: True when limit cut the list short.
    GetApiV1AgentsAgentidResponse:
      type: object
      properties:
        agent:
          type: object
          description: Agent fields as in /api/v1/agents.
        latestHealth:
          type: object
          description: The newest health sample, or null when there is none.
        activeAlerts:
          type: integer
          description: Number of active alerts.
    GetApiV1AlertsResponse:
      type: object
      properties:
        alerts:
          type: array
          description: List of alert objects.
        total:
          type: integer
          description: Total number of alerts matching the filters.
        truncated:
          type: boolean
          description: True when limit cut the list short.
    GetApiV1DeviceContextResponse:
      type: object
      properties:
        matchedBy:
          type: string
          description: agent_id, hostname, short_name, or none.
        devices:
          type: array
          description: List of device objects (max 5).
        truncated:
          type: boolean
          description: True when more than 5 devices matched.
    GetApiV1SummaryResponse:
      type: object
      properties:
        agents:
          type: integer
          description: Total agents.
        online:
          type: integer
          description: Online agents.
        offline:
          type: integer
          description: Offline agents.
        windows:
          type: integer
          description: Windows agents.
        linux:
          type: integer
          description: Linux agents.
        other:
          type: integer
          description: Agents with other OS.
        isolated:
          type: integer
          description: Isolated agents.
        activeAlerts:
          type: integer
          description: Total active alerts.
        activeAlertsBySeverity:
          type: object
          description: Object keyed by severity with counts.
        generatedAt:
          type: string
          description: Timestamp of generation.
    PutBlobBlobidResponse:
      type: object
      properties:
        blobId:
          type: string
        sha256:
          type: string
        sizeBytes:
          type: integer
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
security:
- bearer: []
tags:
- name: Api
- name: Atservicesrest
- name: Blob
- name: Downloads
- name: Health
- name: Install
- name: Ready
- name: Rest
- name: V4 6 Release