ODIN API

REST API for ODIN, Cyble's internet-scanning search engine. Twenty-seven operations across five datasets — Hosts (IPv4 scan results, services, ASN/geo enrichment, CVEs and exploits), Exposed Buckets (AI/ML-labelled cloud storage across AWS/GCP/Azure/DigitalOcean/Akamai/Linode/Alibaba/IBM), Exposed Files (categorised and labelled files harvested from exposed buckets), Domains (search, subdomains, WHOIS current and historical, registration and expiry checks), and Fields (the queryable field registry per dataset) — plus a health check. Queries use Lucene syntax over 400+ fields. Authentication is a single X-API-Key request header issued from the ODIN search console; all calls must be made over HTTPS.

OpenAPI Specification

cyble-odin-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: Odin
  description:
    "ODIN APIs to search across IP Services, CVEs, Exposed Files/Buckets,\
    \ Domains and more"
  contact: {}
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
  version: "1.0"
servers:
  - url: https://api.odin.io/
paths:
  /v1/cves/all/{ip}/{page}:
    get:
      tags:
        - Hosts
      summary: Get cve details
      description: Get the detailed cve details for ip based on page
      parameters:
        - name: ip
          in: path
          description: get the ip
          required: true
          schema:
            type: string
        - name: page
          in: path
          description: get the page
          required: true
          schema:
            type: string
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ipservices.IpCveResponse"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "402":
          description: Payment Required
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "408":
          description: Request Timeout
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
      security:
        - ApiKeyAuth: []
  /v1/domain/count:
    post:
      tags:
        - domain
      summary: Get domains count
      description: Get count of domain records based on query
      requestBody:
        description: Query
        content:
          "*/*":
            schema:
              $ref: "#/components/schemas/dns.DNSCountRequest"
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/dns.APIResponse"
                  - type: object
                    properties:
                      data:
                        $ref: "#/components/schemas/dns.Data"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/dns.ErrorResponse"
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/dns.ErrorResponse"
      x-codegen-request-body-name: query
  /v1/domain/search:
    post:
      tags:
        - domain
      summary: Search domains
      description: Search domains based on the query
      requestBody:
        description: Query
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/dns.DomainRequest"
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: "#/components/schemas/eshandler.DNS"
                      pagination:
                        $ref: "#/components/schemas/dns.SearchPagination"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/dns.ErrorResponse"
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/dns.ErrorResponse"
      x-codegen-request-body-name: query
  /v1/domain/subdomain/count:
    post:
      tags:
        - domain
      summary: Fetch the total no. of subdomain records
      description: Returns the count of subdomain records based on domain
      requestBody:
        description: Query
        content:
          "*/*":
            schema:
              $ref: "#/components/schemas/dns.DNSCountRequest"
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/dns.APIResponse"
                  - type: object
                    properties:
                      data:
                        $ref: "#/components/schemas/dns.Data"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/dns.ErrorResponse"
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/dns.ErrorResponse"
      security:
        - ApiKeyAuth: []
      x-codegen-request-body-name: query
  /v1/domain/subdomain/search:
    post:
      tags:
        - domain
      summary: Fetch the subdomain record
      description: Returns the subdomain records based on query
      requestBody:
        description: Query
        content:
          "application/json":
            schema:
              $ref: "#/components/schemas/dns.DomainRequest"
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          type: string
                      pagination:
                        $ref: "#/components/schemas/dns.SearchPagination"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/dns.ErrorResponse"
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/dns.ErrorResponse"
      security:
        - ApiKeyAuth: []
      x-codegen-request-body-name: query
  /v1/domain/whois/{domain-name}:
    get:
      tags:
        - domain
      summary: Fetch the domain whois record details
      description:
        "Provides extensive details about the domain whois record like\
        \ name servers, domain status, registrar, etc."
      parameters:
        - name: domain-name
          in: path
          description: domain
          required: true
          schema:
            type: string
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/schema.APIResponse"
                  - type: object
                    properties:
                      data:
                        $ref: "#/components/schemas/schema.DomainWhoisResponse"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
        "402":
          description: Payment Required
          content:
            application/json:
              schema:
                type: object
        "408":
          description: Request Timeout
          content:
            application/json:
              schema:
                type: object
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
      security:
        - ApiKeyAuth: []
  /v1/domain/whois/{domain-name}/historical:
    get:
      tags:
        - domain
      summary: Fetch all the domain whois historical records
      description:
        "Provides historical details about the domain whois record like\
        \ name servers, domain status, registrar, etc"
      parameters:
        - name: domain-name
          in: path
          description: domain
          required: true
          schema:
            type: string
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    properties:
                      " meta":
                        $ref: "#/components/schemas/schema.PaginationMeta"
                      data:
                        type: array
                        items:
                          $ref: "#/components/schemas/schema.DomainWhoisResponse"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
        "402":
          description: Payment Required
          content:
            application/json:
              schema:
                type: object
        "408":
          description: Request Timeout
          content:
            application/json:
              schema:
                type: object
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
      security:
        - ApiKeyAuth: []
  /v1/domain/whois/{domain-name}/is-expired:
    get:
      tags:
        - domain
      summary: Get the expiry for a particular domain
      description:
        "Provides historical details about the domain whois record like\
        \ name servers, domain status, registrar, etc"
      parameters:
        - name: domain-name
          in: path
          description: domain
          required: true
          schema:
            type: string
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: "#/components/schemas/schema.DomainWhoisResponse"
                      meta:
                        $ref: "#/components/schemas/schema.PaginationMeta"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
        "402":
          description: Payment Required
          content:
            application/json:
              schema:
                type: object
        "408":
          description: Request Timeout
          content:
            application/json:
              schema:
                type: object
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
      security:
        - ApiKeyAuth: []
  /v1/domain/whois/{domain-name}/is-registered:
    get:
      tags:
        - domain
      summary: Fetch all the domain whois historical records
      description:
        "Provides historical details about the domain whois record like\
        \ name servers, domain status, registrar, etc"
      parameters:
        - name: domain-name
          in: path
          description: domain
          required: true
          schema:
            type: string
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: "#/components/schemas/schema.DomainWhoisResponse"
                      meta:
                        $ref: "#/components/schemas/schema.PaginationMeta"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
        "402":
          description: Payment Required
          content:
            application/json:
              schema:
                type: object
        "408":
          description: Request Timeout
          content:
            application/json:
              schema:
                type: object
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
      security:
        - ApiKeyAuth: []
  /v1/exposed/buckets/count:
    post:
      tags:
        - ExposedBuckets
      summary: Get exposed bucket count
      description: Get exposed bucket count according to provided filters
      requestBody:
        description: Count Request
        content:
          "*/*":
            schema:
              $ref: "#/components/schemas/exposed.CountRequest"
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/exposed.APIResponse"
                  - type: object
                    properties:
                      data:
                        $ref: "#/components/schemas/exposed.SearchCount"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      security:
        - ApiKeyAuth: []
      x-codegen-request-body-name: query
  /v1/exposed/buckets/search:
    post:
      tags:
        - ExposedBuckets
      operationId: searchExposedBuckets
      summary: Search exposed buckets
      description: |-
        Search exposed buckets according to provided filters
        Search across categories "img, aud, vid, font, doc, src, web, bkup, dbdump"
        Search across labels "credential, financial, pii, legal, ip, medical, hr, report, confidential, backup, compromised, vulnerable"
        Search across providers "aws, gcp, do, linode"
      requestBody:
        description: Search Query
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/exposed.SearchRequest"
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/exposed.SearchResponse"
                  success:
                    type: boolean
                  pagination:
                    type: object
                    properties:
                      total:
                        type: integer
                      limit:
                        type: integer
                      start:
                        type: array
                        items:
                          type: object
                      last:
                        type: array
                        items:
                          type: object
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      security:
        - ApiKeyAuth: []
      x-codegen-request-body-name: query
  /v1/exposed/buckets/summary:
    post:
      tags:
        - ExposedBuckets
      summary: Get exposed buckets summary
      description: Get Returns exposed buckets aggregated count according to filters
      requestBody:
        description: Summary Request
        content:
          "*/*":
            schema:
              $ref: "#/components/schemas/exposed.SummaryRequest"
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/exposed.APIResponse"
                  - type: object
                    properties:
                      data:
                        $ref: "#/components/schemas/exposed.Aggregate"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      security:
        - ApiKeyAuth: []
      x-codegen-request-body-name: query
  /v1/exposed/files/count:
    post:
      tags:
        - ExposedFiles
      summary: Get file count
      description: Returns overall count of exposed bucket files according to filters
      requestBody:
        description: Count Request
        content:
          "*/*":
            schema:
              $ref: "#/components/schemas/exposed.CountRequest"
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/exposed.APIResponse"
                  - type: object
                    properties:
                      data:
                        $ref: "#/components/schemas/exposed.SearchCount"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      security:
        - ApiKeyAuth: []
      x-codegen-request-body-name: query
  /v1/exposed/files/search:
    post:
      tags:
        - ExposedFiles
      summary: Search exposed files
      description: |-
        Search exposed files using advanved filters
        Search across categories "img, aud, vid, font, txt, doc, src, db, march, arch, 3d, exec, key, cert"
        Search across labels "credential, financial, pii, legal, ip, medical, hr, report, confidential, backup, compromised, vulnerable"
        Search across providers "aws, gcp, do, linode"
      requestBody:
        description: Search Query
        content:
          "*/*":
            schema:
              $ref: "#/components/schemas/exposed.SearchRequest"
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/exposed.FileAPIResponse"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        "402":
          description: Payment Required
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      security:
        - ApiKeyAuth: []
      x-codegen-request-body-name: query
  /v1/exposed/files/summary:
    post:
      tags:
        - ExposedFiles
      summary: Get file summary
      description:
        Returns a summary of exposed bucket files according to provided
        filters
      requestBody:
        description: Summary Request
        content:
          "*/*":
            schema:
              $ref: "#/components/schemas/exposed.SummaryRequest"
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/exposed.APIResponse"
                  - type: object
                    properties:
                      data:
                        $ref: "#/components/schemas/exposed.Aggregate"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      security:
        - ApiKeyAuth: []
      x-codegen-request-body-name: query
  /v1/fields/exposed/buckets:
    get:
      tags:
        - Fields
      summary: Get the fields for exposed buckets
      description:
        Get the list of fields that can be used to query on exposed buckets
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/APIResponse"
                  - type: object
                    properties:
                      Data:
                        type: array
                        items:
                          $ref: "#/components/schemas/Field"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "402":
          description: Payment Required
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "408":
          description: Request Timeout
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
  /v1/fields/exposed/files:
    get:
      tags:
        - Fields
      summary: Get the fields for exposed files
      description: Returns the exposed files fields data
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/APIResponse"
                  - type: object
                    properties:
                      Data:
                        type: array
                        items:
                          $ref: "#/components/schemas/Field"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "402":
          description: Payment Required
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "408":
          description: Request Timeout
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
  /v1/fields/hosts/{category}:
    get:
      tags:
        - Fields
      summary: Get the fields for hosts
      description: Get the list of fields to query on host
      parameters:
        - name: category
          in: path
          description: get the category
          required: true
          schema:
            type: string
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: "#/components/schemas/Field"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "402":
          description: Payment Required
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "408":
          description: Request Timeout
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
  /v1/hosts/count:
    post:
      tags:
        - Hosts
      summary: Get the record count
      description: Returns the total no of records based on query
      requestBody:
        description: Count Query
        content:
          "*/*":
            schema:
              $ref: "#/components/schemas/CountRequest"
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/APIResponse"
                  - type: object
                    properties:
                      " meta":
                        $ref: "#/components/schemas/PaginationStruct"
                      data:
                        $ref: "#/components/schemas/CertCount"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/ErrorResponse"
                  - type: object
                    properties:
                      " error":
                        type: string
                      success:
                        type: boolean
        "402":
          description: Payment Required
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/ErrorResponse"
                  - type: object
                    properties:
                      " error":
                        type: string
                      success:
                        type: boolean
        "408":
          description: Request Timeout
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/ErrorResponse"
                  - type: object
                    properties:
                      " error":
                        type: string
                      success:
                        type: boolean
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/ErrorResponse"
                  - type: object
                    properties:
                      " error":
                        type: string
                      success:
                        type: boolean
      security:
        - ApiKeyAuth: []
      x-codegen-request-body-name: query
  /v1/hosts/cve/{ip}:
    get:
      tags:
        - Hosts
      summary: Get ip cve details
      description: Get detailed lost of cve ips
      parameters:
        - name: ip
          in: path
          description: get the ip
          required: true
          schema:
            type: string
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ipservices.IpCveResponse"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "402":
          description: Payment Required
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "408":
          description: Request Timeout
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
      security:
        - ApiKeyAuth: []
  /v1/hosts/cves/{ip}/{cve}:
    get:
      tags:
        - Hosts
      summary: Get cve
      description: Get the detailed cve based on ip and cve
      parameters:
        - name: ip
          in: path
          description: host ip ip
          required: true
          schema:
            type: string
        - name: cve
          in: path
          description: cve id
          required: true
          schema:
            type: string
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ipservices.IpCveResponse"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "408":
          description: Request Timeout
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
      security:
        - ApiKeyAuth: []
  /v1/hosts/exploits/{ip}:
    get:
      tags:
        - Hosts
      summary: Get exploits for ip
      description: Get the detailed list of exploits for the ip
      parameters:
        - name: ip
          in: path
          description: get the ip
          required: true
          schema:
            type: string
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ipservices.IpCveResponse"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "402":
          description: Payment Required
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "408":
          description: Request Timeout
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
      security:
        - ApiKeyAuth: []
  /v1/hosts/exploits/{ip}/{cve}:
    get:
      tags:
        - Hosts
      summary: Get exploits for ip and cve
      description: Get the detailed exploit details for ip and cve
      parameters:
        - name: ip
          in: path
          description: ip address of the host
          required: true
          schema:
            type: string
        - name: cve
          in: path
          description: cve id
          required: true
          schema:
            type: string
      responses:
        "200":
          description: OK
          

# --- truncated at 32 KB (61 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/cyble/refs/heads/main/openapi/cyble-odin-openapi.yml