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

# Get Skills

> Returns a list of Skill objects.

export const IntegrationSupport = ({category = "HRIS", model, direction = "read"}) => {
  const SHEET_BASE = "https://docs.google.com/spreadsheets/d/e/2PACX-1vTx0G0yItXlZKO4Zep8wstZuvvO7bgOxFXBVK_1vvQnxpG8H2hP9n9M8kmZMfIoo7ZO4e7_utrz3_XB/pub";
  const SHEET_GIDS = {
    HRIS: {
      read: "0",
      write: "1626747715"
    },
    ATS: {
      read: "1962490874"
    },
    LMS: {
      read: "1106223511"
    }
  };
  const LOGO_ROW = "logo link";
  const HEADER_ROW = "model";
  const TYPE_ROW = "connection type";
  const parseCsv = text => {
    const rows = [];
    let row = [];
    let field = "";
    let quoted = false;
    for (let i = 0; i < text.length; i++) {
      const c = text[i];
      if (quoted) {
        if (c === '"') {
          if (text[i + 1] === '"') {
            field += '"';
            i++;
          } else {
            quoted = false;
          }
        } else {
          field += c;
        }
      } else if (c === '"') {
        quoted = true;
      } else if (c === ",") {
        row.push(field);
        field = "";
      } else if (c === "\n" || c === "\r") {
        if (c === "\r" && text[i + 1] === "\n") i++;
        row.push(field);
        rows.push(row);
        row = [];
        field = "";
      } else {
        field += c;
      }
    }
    if (field !== "" || row.length) {
      row.push(field);
      rows.push(row);
    }
    return rows;
  };
  const cell = (row, i) => (row && row[i] || "").trim();
  const parseSheet = (csv, wanted) => {
    const rows = parseCsv(csv);
    let header = null;
    let labelCol = -1;
    rows.slice(0, 12).forEach(r => {
      if (header) return;
      for (let i = 0; i < Math.min(r.length, 6); i++) {
        if (cell(r, i).toLowerCase() === HEADER_ROW) {
          header = r;
          labelCol = i;
          return;
        }
      }
    });
    const find = label => rows.find(r => cell(r, labelCol).toLowerCase() === label);
    const types = header ? find(TYPE_ROW) : null;
    const logos = header ? find(LOGO_ROW) : null;
    if (!header || !types) return null;
    const providers = [];
    for (let i = labelCol + 1; i < header.length; i++) {
      const name = cell(header, i);
      const t = cell(types, i).toUpperCase();
      if (!name || t !== "A" && t !== "S") continue;
      providers.push({
        name,
        type: t === "S" ? "SFTP" : "API",
        col: i,
        uid: name + "#" + i,
        logo: cell(logos, i)
      });
    }
    const target = String(wanted || "").toLowerCase();
    const row = rows.find(r => cell(r, labelCol).toLowerCase() === target);
    if (!providers.length || !row) return null;
    const pool = providers;
    const supported = [];
    pool.forEach(p => {
      const v = cell(row, p.col).toUpperCase();
      if (v === "Y" || v === "B") supported.push({
        ...p,
        beta: v === "B"
      });
    });
    if (!supported.length) return {
      none: true
    };
    return {
      total: pool.length,
      supported
    };
  };
  const CSS = `
  .bb-is {
    --bb-border: #e5e3df;
    --bb-border-strong: #d4d1cc;
    --bb-bg: #fcfcfb;
    --bb-bg-sub: #f5f4f3;
    --bb-text: #1c1b1a;
    --bb-text-dim: #6e6c68;
    --bb-accent: #f57e21;
    --bb-chip: #eceae7;
    font-size: 14px;
    color: var(--bb-text);
    border: 1px solid var(--bb-border);
    border-radius: 6px;
    background: var(--bb-bg);
    margin: 1.5rem 0;
    overflow: hidden;
  }
  html.dark .bb-is {
    --bb-border: #242424;
    --bb-border-strong: #333333;
    --bb-bg: #090909;
    --bb-bg-sub: #141414;
    --bb-text: #ededed;
    --bb-text-dim: #a1a1a1;
    --bb-chip: #1b1b1b;
  }

  .bb-is-head {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: 8px;
    padding: 11px 14px;
    background: var(--bb-bg-sub);
    border-bottom: 1px solid var(--bb-border);
  }
  .bb-is-title {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    font-weight: 600;
    font-size: 16px;
  }
  /* Mintlify's <Icon> paints itself via a mask, so this makes it take the
     title's colour instead of staying its own. */
  .bb-is-title .icon { background-color: currentColor !important; }
  .bb-is-count {
    font-size: 12px;
    color: var(--bb-text-dim);
  }

  .bb-is-chips {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
    padding: 12px 14px;
  }
  /* Collapsed by default: one row of chips, the next row fading out under a
     gradient so it reads as "there is more" rather than as a hard crop. The
     wrapper does the clipping so the chips keep their own padding. */
  .bb-is-chips-wrap { position: relative; }
  .bb-is-chips-wrap[data-open="false"] .bb-is-chips {
    max-height: 47px;
    overflow: hidden;
  }
  .bb-is-fade {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 28px;
    pointer-events: none;
    background: linear-gradient(to bottom, rgba(252, 252, 251, 0), var(--bb-bg));
  }
  html.dark .bb-is-fade {
    background: linear-gradient(to bottom, rgba(9, 9, 9, 0), var(--bb-bg));
  }
  .bb-is-toggle {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 4px 10px;
    border: 1px solid var(--bb-border-strong);
    border-radius: 999px;
    background: var(--bb-bg);
    color: var(--bb-text-dim);
    font-size: 12.5px;
    font-weight: 500;
    line-height: 1.5;
    cursor: pointer;
  }
  .bb-is-toggle:hover {
    color: var(--bb-text);
    border-color: var(--bb-text-dim);
  }
  .bb-is-headright {
    display: inline-flex;
    align-items: center;
    gap: 10px;
  }
  .bb-is-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 9px;
    border: 1px solid var(--bb-border);
    border-radius: 999px;
    background: var(--bb-bg-sub);
    font-size: 12.5px;
    line-height: 1.4;
    white-space: nowrap;
  }
  .bb-is-logo {
    width: 15px;
    height: 15px;
    object-fit: contain;
    border-radius: 3px;
    flex: none;
  }
  .bb-is-badge {
    font-size: 9.5px;
    font-weight: 600;
    letter-spacing: 0.03em;
    padding: 1px 5px;
    border-radius: 3px;
    background: var(--bb-chip);
    color: var(--bb-text-dim);
  }
  .bb-is-badge[data-beta="true"] { color: #6d28d9; background: rgba(109, 40, 217, 0.12); }
  html.dark .bb-is-badge[data-beta="true"] { color: #b39bf5; background: rgba(139, 92, 246, 0.16); }
  /* Muted on purpose - the provider name should catch the eye in this list,
     not its connection-type badge. --bb-chip sat too close to the chip's own
     --bb-bg-sub to read as a separate shape, so the fill is a step further
     from it in each theme - darker in light mode, and lighter (not literally
     "darker") in dark mode, since going darker there would fade it into the
     near-black page instead of separating it. */
  .bb-is-badge[data-type="SFTP"] { color: var(--bb-text-dim); background: #ddd9d3; }
  html.dark .bb-is-badge[data-type="SFTP"] { background: #292929; }

  .bb-is-foot {
    padding: 9px 14px;
    border-top: 1px solid var(--bb-border);
    font-size: 14px;
    color: var(--bb-text-dim);
  }
  .bb-is-foot a { color: var(--bb-accent); text-decoration: none; }
  .bb-is-foot a:hover { text-decoration: underline; }

  .bb-is-none {
    padding: 16px 14px;
    font-size: 14px;
    line-height: 1.5;
    color: var(--bb-text-dim);
  }
  .bb-is-none a { color: var(--bb-accent); text-decoration: none; }
  .bb-is-none a:hover { text-decoration: underline; }

  .bb-is-loading {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    padding: 28px 14px;
    font-size: 12.5px;
    color: var(--bb-text-dim);
  }
  .bb-is-spinner {
    width: 18px;
    height: 18px;
    border: 2px solid var(--bb-border);
    border-top-color: var(--bb-accent);
    border-radius: 50%;
    animation: bb-is-spin 0.7s linear infinite;
    flex: none;
  }
  @keyframes bb-is-spin {
    to { transform: rotate(360deg); }
  }
  /* Keep a motion cue for anyone who asked for less of it, just a calmer one. */
  @media (prefers-reduced-motion: reduce) {
    .bb-is-spinner { animation-duration: 2.4s; }
  }
  `;
  const [data, setData] = useState(null);
  const [open, setOpen] = useState(false);
  useEffect(() => {
    let live = true;
    const tabs = SHEET_GIDS[category] || ({});
    const gid = tabs[direction];
    if (!gid) return;
    const url = SHEET_BASE + "?gid=" + encodeURIComponent(gid) + "&single=true&output=csv&_=" + Date.now();
    fetch(url, {
      cache: "no-store"
    }).then(res => res.ok ? res.text() : Promise.reject(res.status)).then(text => {
      if (live) setData(parseSheet(text, model) || ({
        hide: true
      }));
    }).catch(() => {
      if (live) setData({
        hide: true
      });
    });
    return () => {
      live = false;
    };
  }, [category, model, direction]);
  if (data && data.hide) return null;
  const none = !!(data && data.none);
  const verb = direction === "write" ? "writing" : "reading";
  const mailto = "mailto:support@bindbee.dev?subject=" + encodeURIComponent("Integration request: " + verb + " " + model + " (" + category + ")");
  const betaCount = data && !none ? data.supported.filter(p => p.beta).length : 0;
  const liveCount = data && !none ? data.supported.length - betaCount : 0;
  const collapsible = !!(data && !none && data.supported.length > 4);
  return <div className="bb-is not-prose">
      <style>{CSS}</style>
      <div className="bb-is-head">
        <span className="bb-is-title">
          <Icon icon="git-fork" size={15} />
          Supported integrations
        </span>
        {data && !none ? <span className="bb-is-headright">
            <span className="bb-is-count">
              {liveCount} Live
              {betaCount ? " + " + betaCount + " Beta" : ""}
            </span>
            {collapsible ? <button type="button" className="bb-is-toggle" aria-expanded={open} onClick={() => setOpen(!open)}>
                {open ? "Show less" : "Show all"}
              </button> : null}
          </span> : null}
      </div>

      {!data ? <div className="bb-is-loading" role="status">
          <span className="bb-is-spinner" aria-hidden="true" />
          <span>Loading integration support…</span>
        </div> : none ? <div className="bb-is-none">
          No integration supports {verb} {model} yet.{" "}
          <a href={mailto}>Tell us which one you need</a>
        </div> : <div className="bb-is-chips-wrap" data-open={collapsible ? open : true}>
          <div className="bb-is-chips">
            {data.supported.map(p => <span className="bb-is-chip" key={p.uid}>
                {p.logo ? <img className="bb-is-logo" src={p.logo} alt="" loading="lazy" onError={e => {
    e.currentTarget.style.display = "none";
  }} /> : null}
                <span>{p.name}</span>
                {p.type === "SFTP" ? <span className="bb-is-badge" data-type="SFTP">
                    SFTP
                  </span> : null}
                {p.beta ? <span className="bb-is-badge" data-beta="true">
                    BETA
                  </span> : null}
              </span>)}
          </div>
          {collapsible && !open ? <span className="bb-is-fade" /> : null}
        </div>}

      <div className="bb-is-foot">
        Coverage varies by integrations {" "}
        <a href="/get-started/model-availability">See the full availability matrix</a>
      </div>
    </div>;
};

<IntegrationSupport category="HRIS" model="Skill" />


## OpenAPI

````yaml get /api/hris/v1/skills
openapi: 3.1.0
info:
  title: Bindbee APIs
  version: 0.1.0
servers:
  - url: https://api.bindbee.dev
  - url: https://api-eu.bindbee.dev
security: []
paths:
  /api/hris/v1/skills:
    get:
      tags:
        - Skills
      summary: Get Skills
      description: Returns a list of Skill objects.
      operationId: get_skills_api_hris_v1_skills_get
      parameters:
        - name: ids
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: The ID of the skills to fetch
            examples:
              - >-
                01931edf-04b6-7391-8a5c-93ac4b395316,01931edf-04c8-7649-a470-d85f6161bd1a
            title: Ids
          description: The ID of the skills to fetch
        - name: status
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: The status to filter skills by.
            examples:
              - ACTIVE
            title: Status
          description: The status to filter skills by.
        - name: remote_id
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: The third-party API ID of the matching object.
            examples:
              - 0419332b6a771001d419652ec1e50001
            title: Remote Id
          description: The third-party API ID of the matching object.
        - name: include_raw_data
          in: query
          required: false
          schema:
            type: boolean
            description: >-
              Whether to include the original data Bindbee fetched from the
              third-party to produce these models.
            examples:
              - false
            default: false
            title: Include Raw Data
          description: >-
            Whether to include the original data Bindbee fetched from the
            third-party to produce these models.
        - name: include_custom_fields
          in: query
          required: false
          schema:
            type: boolean
            description: Whether to include custom fields in the response.
            examples:
              - false
            default: false
            title: Include Custom Fields
          description: Whether to include custom fields in the response.
        - name: modified_after
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              If provided, only objects synced by Bindbee after this date time
              will be returned. Format: DateTime (ISO 8601). If no timezone
              offset is supplied, the value is interpreted as UTC.
            examples:
              - '2024-02-21T21:22:12.993Z'
            title: Modified After
          description: >-
            If provided, only objects synced by Bindbee after this date time
            will be returned. Format: DateTime (ISO 8601). If no timezone offset
            is supplied, the value is interpreted as UTC.
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            maximum: 200
            minimum: 1
            description: Number of results to return per page. Maximum size is 200.
            default: 50
            title: Page Size
          description: Number of results to return per page. Maximum size is 200.
        - name: cursor
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: The pagination cursor value.
            title: Cursor
          description: The pagination cursor value.
        - name: x-connector-token
          in: header
          required: true
          schema:
            type: string
            title: X-Connector-Token
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedResponse_HrisSkill_'
        '401':
          description: Missing or invalid bearer authentication credentials.
          headers:
            WWW-Authenticate:
              description: Bearer authentication challenge.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            The credentials are valid but do not permit access to this resource,
            e.g. a connector token used on a different API category or a model
            whose writes are disabled.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: Rate limit exceeded.
          headers:
            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: >-
                Unix timestamp (seconds since epoch) at which the current
                rate-limit window resets.
              schema:
                type: integer
            Retry-After:
              description: Seconds to wait before retrying the request.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - HTTPBearer: []
components:
  schemas:
    PaginatedResponse_HrisSkill_:
      properties:
        cursor:
          anyOf:
            - type: string
            - type: 'null'
          title: Cursor
          description: Cursor value to fetch next set of items
          examples:
            - MDE4YjE4ZWYtYzk5Yy03YTg2LTk5NDYtN2I3YzlkNTQzM2U1
        page_size:
          type: integer
          title: Page Size
          description: Indicates the count of items in the response
          examples:
            - 50
        items:
          items:
            $ref: '#/components/schemas/HrisSkill'
          type: array
          title: Items
          description: List of items in the current response
      type: object
      required:
        - cursor
        - page_size
        - items
      title: PaginatedResponse[HrisSkill]
    ErrorResponse:
      type: object
      required:
        - detail
      properties:
        detail:
          type: string
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    HrisSkill:
      properties:
        id:
          type: string
          format: uuid
          title: Id
          examples:
            - 018b18ef-c487-703c-afd9-0ca478ccd9d6
        remote_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Remote Id
          description: The third-party API ID of the matching object.
          examples:
            - '123321'
        modified_at:
          type: string
          format: date-time
          title: Modified At
          description: This is the datetime that this object was last updated by Bindbee
          examples:
            - '2021-10-16T00:00:00Z'
        raw_data:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Raw Data
          description: This is the Raw data
          examples:
            - key_1: Platform dependent data 1
              key_2: Platform dependent data 2
        custom_fields:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Custom Fields
          description: The custom fields related to the model
          examples:
            - category_group: REG
              disability_type: ASBERG
              hire_date: '1991-03-16T00:00:00'
              hire_source: REFER
              nationality: USA
              original_hire_date: '1991-03-16T00:00:00'
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
          description: Human-readable name of the skill.
          examples:
            - Employee Relations
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: A detailed description of the skill.
          examples:
            - Maintain good relations with Employees
        category:
          anyOf:
            - type: string
            - type: 'null'
          title: Category
          description: >-
            The category this skill belongs to, such as a department or
            competency group.
          examples:
            - Human Resources
        status:
          anyOf:
            - type: string
            - type: 'null'
          enum:
            - ACTIVE
            - INACTIVE
          title: Status
          description: >-
            The status of the skill. If the value is not one of the defined enum
            values, the original value passed through will be returned.
          examples:
            - ACTIVE
        proficiency_scale:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Proficiency Scale
          description: >-
            The scale used to measure proficiency in this skill. Shape depends
            on the embedded 'type' key: when 'type' is 'NUMERIC', the object
            also carries 'min', 'max', and 'step'; when 'type' is
            'SINGLE_SELECT', the object carries 'options', a flat list of the
            allowed proficiency labels.
          examples:
            - max: 5
              min: 1
              step: 0.5
              type: NUMERIC
            - options:
                - BEGINNER
                - ADVANCED
                - PRO
                - EXPERT
              type: SINGLE_SELECT
      type: object
      required:
        - id
        - remote_id
        - modified_at
        - custom_fields
        - name
        - description
        - category
        - status
        - proficiency_scale
      title: HrisSkill
      description: >-
        The Skill object represents a skill definition, such as a competency or
        proficiency area, that can be assigned to employees.
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    HTTPBearer:
      type: http
      scheme: bearer

````