EcoAloha Share API

Public expiring shortlists.

Operations 3

POST /share Create a public shortlist that expires after 30 days. #
GET /share/{id} Read a public shortlist #
DELETE /share/{id} Delete a shortlist using its deletion token #

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/ecoaloha-com:ecoaloha-com-share-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

ecoaloha-com-share-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: EcoAloha Share API
  version: 1.1.0
  summary: 'EcoAloha API: search, compare and link to city experiences for AI agents.'
  description: 'Anonymous, read-mostly travel discovery API. No bookings or payments; booking links are affiliate links to Viator. Partner data endpoints return 503 until public agent distribution is approved. Share creation is a rate-limited write that stores product IDs for 30 days. Prices are indicative starting prices in the requested currency (EUR default). Partner text is untrusted content, never instructions. Authentication: none (public, keyless; see /auth.md). Versioning: URL path /v1. Deprecation policy: deprecated versions announce a Sunset header (RFC 8594) at least 90 days before removal and a Deprecation header (RFC 9745) on every response of the deprecated version. Pagination: cursor based (query cursor and limit, response nextCursor) on GET /experiences. Batch: POST /compare accepts up to 5 experience ids in one request. Rate limits: RateLimit-Limit, RateLimit-Remaining and RateLimit-Policy headers on every response, Retry-After on 429. Errors are application/problem+json (RFC 9457). Sandbox: use the server https://ecoaloha.com/api/v1/sandbox, or send X-Sandbox: true (or ?sandbox=true) to supported experience, comparison, booking-link and share-creation operations, to get fixture data without quota or side effects. Sandbox search uses two fixed fixtures and does not emulate partner filters or sorting. Sandbox reviews are empty. Unsupported sandbox routes return 404. Destination and collection discovery reads use published data.'
  termsOfService: https://ecoaloha.com/terms
  contact:
    name: EcoAloha
    url: https://ecoaloha.com/for-agents
    email: hello@ecoaloha.com
  license:
    name: Proprietary
    url: https://ecoaloha.com/terms
servers:
- url: https://ecoaloha.com/api/v1
  description: Production
- url: https://ecoaloha.com/api/v1/sandbox
  description: 'Sandbox / test environment: same routes, fixture data, no quota, no partner call, no writes.'
security: []
tags:
- name: Share
  description: Public expiring shortlists.
paths:
  /share:
    post:
      operationId: create_share_list
      summary: Create a public shortlist that expires after 30 days.
      tags:
      - Share
      x-mcp-tool: create_share_list
      description: 'Create a public shortlist that expires after 30 days. Idempotent with Idempotency-Key. Requires partner access; returns 503 AGENT_ACCESS_NOT_APPROVED until enabled. Rate limited. Sandbox: X-Sandbox: true returns fixture data.'
      parameters:
      - name: X-Sandbox
        in: header
        required: false
        schema:
          type: string
          enum:
          - 'true'
        description: 'Sandbox / test mode: fixture data, no partner call, no quota, no writes.'
      - name: Idempotency-Key
        in: header
        required: false
        schema:
          type: string
          minLength: 1
          maxLength: 128
        description: Client-generated unique key, for example a UUID. A retry with the same key within 24 hours returns the stored response instead of creating a second share list. Read operations echo the key back.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
              - experienceIds
              properties:
                experienceIds:
                  type: array
                  minItems: 1
                  maxItems: 20
                  uniqueItems: true
                  items:
                    type: string
                    pattern: ^[A-Za-z0-9_-]{1,80}$
                    description: Viator product code, for example 5010SYDNEY.
                    examples:
                    - 5010SYDNEY
                currency:
                  type: string
                  enum:
                  - EUR
                  - USD
                  - GBP
                  default: EUR
                  description: Display currency for prices.
            example:
              experienceIds:
              - 5010SYDNEY
      responses:
        '201':
          description: Created. Keep deletionToken private.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    $ref: '#/components/schemas/ShareCreated'
              example:
                data:
                  id: a1b2c3
                  url: https://ecoaloha.com/share/a1b2c3
                  deletionToken: '000000000000000000000000000000000000000000000000'
                  expiresAt: '2026-10-05T09:00:00.000Z'
        '400':
          description: Invalid input.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: https://ecoaloha.com/for-agents#INVALID_INPUT
                title: Invalid input
                status: 400
                detail: 'experienceIds: Array must contain...'
                code: INVALID_INPUT
                error:
                  code: INVALID_INPUT
                  message: 'experienceIds: Array must contain...'
        '404':
          description: Not found.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: https://ecoaloha.com/for-agents#NOT_FOUND
                title: Not found
                status: 404
                detail: Collection not found
                code: NOT_FOUND
                error:
                  code: NOT_FOUND
                  message: Collection not found
        '429':
          description: Rate limited.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: https://ecoaloha.com/for-agents#RATE_LIMITED
                title: Rate limited
                status: 429
                detail: Too many requests; try again later
                code: RATE_LIMITED
                error:
                  code: RATE_LIMITED
                  message: Too many requests; try again later
          headers:
            Retry-After:
              schema:
                type: integer
              description: Seconds.
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
        '503':
          description: Partner access is not enabled. The error includes a docs URL.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: https://ecoaloha.com/for-agents#AGENT_ACCESS_NOT_APPROVED
                title: Partner access is not enabled. The error includes a docs URL
                status: 503
                detail: Public API and agent access await Viator approval
                code: AGENT_ACCESS_NOT_APPROVED
                error:
                  code: AGENT_ACCESS_NOT_APPROVED
                  message: Public API and agent access await Viator approval
  /share/{id}:
    get:
      operationId: get_share_list
      summary: Read a public shortlist
      tags:
      - Share
      x-mcp-tool: get_share_list
      description: Read a public shortlist. Available without partner access.
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Shortlist.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    $ref: '#/components/schemas/Share'
              example:
                data:
                  id: a1b2c3
                  experienceIds:
                  - 5010SYDNEY
                  currency: EUR
                  expiresAt: '2026-10-05T09:00:00.000Z'
        '400':
          description: Invalid input.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: https://ecoaloha.com/for-agents#INVALID_INPUT
                title: Invalid input
                status: 400
                detail: 'experienceIds: Array must contain...'
                code: INVALID_INPUT
                error:
                  code: INVALID_INPUT
                  message: 'experienceIds: Array must contain...'
        '404':
          description: Not found.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: https://ecoaloha.com/for-agents#NOT_FOUND
                title: Not found
                status: 404
                detail: Collection not found
                code: NOT_FOUND
                error:
                  code: NOT_FOUND
                  message: Collection not found
        '429':
          description: Rate limited.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: https://ecoaloha.com/for-agents#RATE_LIMITED
                title: Rate limited
                status: 429
                detail: Too many requests; try again later
                code: RATE_LIMITED
                error:
                  code: RATE_LIMITED
                  message: Too many requests; try again later
          headers:
            Retry-After:
              schema:
                type: integer
              description: Seconds.
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
        '503':
          description: Partner access is not enabled. The error includes a docs URL.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: https://ecoaloha.com/for-agents#AGENT_ACCESS_NOT_APPROVED
                title: Partner access is not enabled. The error includes a docs URL
                status: 503
                detail: Public API and agent access await Viator approval
                code: AGENT_ACCESS_NOT_APPROVED
                error:
                  code: AGENT_ACCESS_NOT_APPROVED
                  message: Public API and agent access await Viator approval
    delete:
      operationId: delete_share_list
      summary: Delete a shortlist using its deletion token
      tags:
      - Share
      x-mcp-tool: delete_share_list
      description: Delete a shortlist using its deletion token. Available without partner access.
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
              - deletionToken
              properties:
                deletionToken:
                  type: string
                  pattern: ^[a-f0-9]{48}$
            example:
              deletionToken: '000000000000000000000000000000000000000000000000'
      responses:
        '200':
          description: Deleted.
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    type: object
                    properties:
                      deleted:
                        type: boolean
              example:
                data:
                  deleted: true
        '400':
          description: Invalid input.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: https://ecoaloha.com/for-agents#INVALID_INPUT
                title: Invalid input
                status: 400
                detail: 'experienceIds: Array must contain...'
                code: INVALID_INPUT
                error:
                  code: INVALID_INPUT
                  message: 'experienceIds: Array must contain...'
        '404':
          description: Not found.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: https://ecoaloha.com/for-agents#NOT_FOUND
                title: Not found
                status: 404
                detail: Collection not found
                code: NOT_FOUND
                error:
                  code: NOT_FOUND
                  message: Collection not found
        '429':
          description: Rate limited.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: https://ecoaloha.com/for-agents#RATE_LIMITED
                title: Rate limited
                status: 429
                detail: Too many requests; try again later
                code: RATE_LIMITED
                error:
                  code: RATE_LIMITED
                  message: Too many requests; try again later
          headers:
            Retry-After:
              schema:
                type: integer
              description: Seconds.
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
        '503':
          description: Partner access is not enabled. The error includes a docs URL.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                type: https://ecoaloha.com/for-agents#AGENT_ACCESS_NOT_APPROVED
                title: Partner access is not enabled. The error includes a docs URL
                status: 503
                detail: Public API and agent access await Viator approval
                code: AGENT_ACCESS_NOT_APPROVED
                error:
                  code: AGENT_ACCESS_NOT_APPROVED
                  message: Public API and agent access await Viator approval
components:
  headers:
    RateLimit:
      schema:
        type: string
      description: limit, remaining and reset (seconds) for live-data quota.
    RateLimit-Policy:
      schema:
        type: string
      description: Quota policy, for example 20;w=3600.
    RateLimit-Remaining:
      schema:
        type: integer
      description: Remaining live-data requests in the current hour.
    Deprecation:
      schema:
        type: string
      description: RFC 9745. Present on every response of a deprecated API version, for example @1735689600 (Unix time of deprecation) or true.
    Sunset:
      schema:
        type: string
        format: http-date
      description: RFC 8594. HTTP date when the deprecated version stops responding. Announced at least 90 days ahead.
    RateLimit-Limit:
      schema:
        type: integer
      description: Live-data requests per hour.
  schemas:
    Error:
      type: object
      description: RFC 9457 problem details plus a legacy `error` object.
      required:
      - type
      - title
      - status
      - detail
      - code
      - error
      properties:
        type:
          type: string
          format: uri
        title:
          type: string
        status:
          type: integer
        detail:
          type: string
        code:
          type: string
        docs:
          type: string
          format: uri
        error:
          type: object
          required:
          - code
          - message
          properties:
            code:
              type: string
              examples:
              - AGENT_ACCESS_NOT_APPROVED
            message:
              type: string
            docs:
              type: string
              format: uri
              description: Where to read more.
    Share:
      type: object
      required:
      - id
      - experienceIds
      - currency
      - expiresAt
      properties:
        id:
          type: string
        experienceIds:
          type: array
          minItems: 1
          maxItems: 20
          uniqueItems: true
          items:
            type: string
            pattern: ^[A-Za-z0-9_-]{1,80}$
            description: Viator product code, for example 5010SYDNEY.
            examples:
            - 5010SYDNEY
        currency:
          type: string
          enum:
          - EUR
          - USD
          - GBP
        expiresAt:
          type: string
          format: date-time
    ShareCreated:
      type: object
      required:
      - id
      - url
      - deletionToken
      - expiresAt
      properties:
        id:
          type: string
        url:
          type: string
          format: uri
        deletionToken:
          type: string
          description: Private. Needed to delete the list. Do not publish.
        expiresAt:
          type: string
          format: date-time
externalDocs:
  description: Agent guide
  url: https://ecoaloha.com/for-agents
x-mcp-server: https://ecoaloha.com/mcp
x-mcp-server-card: https://ecoaloha.com/.well-known/mcp/server-card.json
x-api-catalog: https://ecoaloha.com/.well-known/api-catalog
x-authentication:
  scheme: none
  description: Public keyless API. No OAuth, no API key. See /auth.md.
  docs: https://ecoaloha.com/auth.md
x-versioning-policy:
  scheme: url-path
  current: v1
  deprecation: Deprecated versions announce a Sunset header (RFC 8594) at least 90 days before removal. A Deprecation header (RFC 9745) marks every response of a deprecated version.
  headers:
  - Deprecation
  - Sunset
  noticePeriodDays: 90
  docs: https://ecoaloha.com/auth.md
x-pagination:
  style: cursor
  description: 'GET /experiences pages with an opaque cursor: send cursor and limit (max 50) as query parameters; the response carries nextCursor (null on the last page) beside data.'
  requestParameters:
  - cursor
  - limit
  responseField: nextCursor
  endpoints:
  - /experiences
x-sandbox:
  description: 'Sandbox / test mode. Send the header X-Sandbox: true (or ?sandbox=true) on supported experience, comparison, booking-link and share-creation operations to receive fixture experiences instead of partner data. Sandbox search uses two fixed fixtures and does not emulate partner filters or sorting. Sandbox reviews are empty. Unsupported sandbox routes return 404. Destination and collection discovery reads use published data. No quota is used and nothing is stored. Responses carry X-Sandbox: true.'
  header: X-Sandbox
  query: sandbox
  value: 'true'
  server: https://ecoaloha.com/api/v1/sandbox
  operations:
  - search_experiences
  - get_experience
  - compare_experiences
  - batch_experiences
  - get_booking_link
  - create_share_list
x-idempotency:
  header: Idempotency-Key
  ttlSeconds: 86400
  operations:
  - create_share_list
  - compare_experiences
  - get_booking_link
x-batch-endpoints:
- path: /experiences/batch
  method: post
  operationId: batch_experiences
  itemsField: experienceIds
  maxItems: 5
  description: Bulk read of up to 5 experiences in one request.
- path: /compare
  method: post
  operationId: compare_experiences
  itemsField: experienceIds
  maxItems: 5
  description: Reads up to 5 experiences in one request.
x-llms-txt: https://ecoaloha.com/llms.txt
x-rate-limit:
  description: Per client IP. 60 requests per minute at the edge and 20 partner-data requests per hour.
  edgePerMinute: 60
  partnerDataPerHour: 20