Remote Files and Custom Fields API

Upload and download files attached to employments, companies, and expenses. Define and set customer-managed custom fields on companies and employments. List supported countries and their employment models. Estimate the loaded annual cost of hiring an employee in any country via the cost calculator.

Remote Files and Custom Fields API is one of 9 APIs that Remote publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 1 machine-runnable capability that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko.

Tagged areas include Files, Documents, Custom Fields, Countries, and Cost Calculator. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, sample payloads, and 1 Naftiko capability spec.

OpenAPI Specification

remote-files-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Remote Files And Custom Fields API
  description: |
    Upload, download, and reference files attached to companies and
    employments on Remote. Also covers custom-field definitions and values,
    plus the supported-countries catalog used to look up jurisdiction-aware
    JSON Schema forms across the rest of the platform.
  version: '2026-05-22'
  contact:
    name: Remote API Support
    url: https://support.remote.com/
  x-logo:
    url: https://remote.com/favicon.ico

servers:
  - url: https://gateway.remote.com/v1
    description: Production
  - url: https://gateway.remote-sandbox.com/v1
    description: Sandbox

security:
  - BearerAuth: []

tags:
  - name: Files
    description: Document upload and retrieval
  - name: Custom Fields
    description: Customer-defined fields on companies and employments
  - name: Countries
    description: List of countries Remote supports
  - name: Cost Calculator
    description: Estimate the loaded cost of hiring in a given country

paths:
  /files:
    post:
      summary: Upload A File
      operationId: uploadFile
      tags: [Files]
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required: [file, attachable_id, attachable_type]
              properties:
                file:
                  type: string
                  format: binary
                attachable_id:
                  type: string
                  format: uuid
                attachable_type:
                  type: string
                  enum: [employment, company, expense, contract_document]
                category:
                  type: string
                  description: Optional file category tag.
      responses:
        '201':
          description: Uploaded.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/FileEnvelope' }

  /files/{file_id}:
    parameters:
      - { name: file_id, in: path, required: true, schema: { type: string, format: uuid } }
    get:
      summary: Download A File
      operationId: downloadFile
      tags: [Files]
      responses:
        '200':
          description: File binary or signed URL.
          content:
            application/octet-stream:
              schema: { type: string, format: binary }
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      download_url: { type: string, format: uri }
                      expires_at: { type: string, format: date-time }

  /custom_fields:
    get:
      summary: List Custom Field Definitions
      operationId: listCustomFieldDefinitions
      tags: [Custom Fields]
      parameters:
        - { name: scope, in: query, schema: { type: string, enum: [company, employment] } }
      responses:
        '200':
          description: Custom field definitions.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      custom_fields:
                        type: array
                        items: { $ref: '#/components/schemas/CustomFieldDefinition' }
    post:
      summary: Create A Custom Field Definition
      operationId: createCustomFieldDefinition
      tags: [Custom Fields]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/CustomFieldDefinition' }
      responses:
        '201':
          description: Created.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      custom_field: { $ref: '#/components/schemas/CustomFieldDefinition' }

  /custom_fields/{custom_field_id}/values:
    parameters:
      - { name: custom_field_id, in: path, required: true, schema: { type: string, format: uuid } }
    get:
      summary: List Custom Field Values
      operationId: listCustomFieldValues
      tags: [Custom Fields]
      parameters:
        - { name: subject_id, in: query, schema: { type: string, format: uuid } }
      responses:
        '200':
          description: Values.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      values:
                        type: array
                        items: { $ref: '#/components/schemas/CustomFieldValue' }
    put:
      summary: Upsert A Custom Field Value
      operationId: upsertCustomFieldValue
      tags: [Custom Fields]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/CustomFieldValue' }
      responses:
        '200':
          description: Upserted.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      value: { $ref: '#/components/schemas/CustomFieldValue' }

  /countries:
    get:
      summary: List Supported Countries
      operationId: listCountries
      tags: [Countries]
      responses:
        '200':
          description: Countries.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      countries:
                        type: array
                        items: { $ref: '#/components/schemas/Country' }

  /countries/{country_code}:
    parameters:
      - { name: country_code, in: path, required: true, schema: { type: string, description: ISO 3166-1 alpha-3 country code. } }
    get:
      summary: Show A Country
      operationId: showCountry
      tags: [Countries]
      responses:
        '200':
          description: Country.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      country: { $ref: '#/components/schemas/Country' }

  /cost_calculator/estimate:
    post:
      summary: Estimate Employment Cost
      description: |
        Returns the loaded cost of hiring an employee under EOR or Global
        Payroll, including statutory contributions and Remote platform fees.
      operationId: estimateEmploymentCost
      tags: [Cost Calculator]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [country_code, employment_model, annual_gross_salary, currency]
              properties:
                country_code: { type: string }
                employment_model:
                  type: string
                  enum: [global_payroll, peo, eor]
                annual_gross_salary: { type: integer }
                currency: { type: string }
                include_benefits: { type: boolean, default: true }
      responses:
        '200':
          description: Cost estimate.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      total_annual_cost: { type: integer }
                      employer_contributions: { type: integer }
                      remote_fee: { type: integer }
                      currency: { type: string }
                      breakdown:
                        type: array
                        items:
                          type: object
                          properties:
                            label: { type: string }
                            amount: { type: integer }
                            recurrence:
                              type: string
                              enum: [monthly, annual, one_time]

components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

  schemas:
    File:
      type: object
      properties:
        id: { type: string, format: uuid }
        filename: { type: string }
        content_type: { type: string }
        size: { type: integer }
        attachable_id: { type: string, format: uuid }
        attachable_type:
          type: string
          enum: [employment, company, expense, contract_document]
        category: { type: string, nullable: true }
        created_at: { type: string, format: date-time }
        download_url: { type: string, format: uri }

    FileEnvelope:
      type: object
      properties:
        data:
          type: object
          properties:
            file: { $ref: '#/components/schemas/File' }

    CustomFieldDefinition:
      type: object
      required: [name, scope, type]
      properties:
        id: { type: string, format: uuid }
        name: { type: string }
        scope:
          type: string
          enum: [company, employment]
        type:
          type: string
          enum: [string, number, boolean, date, enum, multiselect]
        options:
          type: array
          items: { type: string }
          description: For enum/multiselect types.
        required: { type: boolean, default: false }
        description: { type: string }

    CustomFieldValue:
      type: object
      required: [subject_id, value]
      properties:
        id: { type: string, format: uuid }
        custom_field_id: { type: string, format: uuid }
        subject_id: { type: string, format: uuid }
        value:
          oneOf:
            - { type: string }
            - { type: number }
            - { type: boolean }
            - { type: array, items: { type: string } }

    Country:
      type: object
      properties:
        code: { type: string, description: ISO 3166-1 alpha-3 country code. }
        name: { type: string }
        currency: { type: string }
        supported_employment_models:
          type: array
          items:
            type: string
            enum: [global_payroll, peo, eor, contractor]
        has_remote_entity: { type: boolean }