MadeOnSol Account API

Self-service account inspection — quota, tier, feature usage. 1 operation(s) of the keyed MadeOnSol API (Bearer msk_ key).

Operations 1

GET /me Self-inspect quota and feature usage #

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/madeonsol:madeonsol-account-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

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

madeonsol-account-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: MadeOnSol Account API
  version: 1.20.0
  description: Real-time Solana & Robinhood Chain trading intelligence — KOL wallet trades, deployer reputation, token buyer-quality scoring, wallet tracking, and copy-trade signals across both chains (Robinhood Chain paths under `/rhc/*`).
  contact:
    name: MadeOnSol
    url: https://madeonsol.com/contact
  license:
    name: Proprietary
    url: https://madeonsol.com/terms
servers:
- url: https://madeonsol.com/api/v1
  description: Production
security:
- BearerAuth: []
tags:
- name: Account
  description: Self-service account inspection — quota, tier, feature usage.
paths:
  /me:
    get:
      tags:
      - Account
      summary: Self-inspect quota and feature usage
      description: Returns the calling subscriber's tier, daily/burst quota state, subscription expiry, and per-feature usage counts (webhooks, copy-trade wallets, coordination rules, watchlist). Available to every authenticated tier — use this to verify your key works and read remaining daily quota without parsing rate-limit headers.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  subscriber:
                    type: string
                  tier:
                    type: string
                    enum:
                    - BASIC
                    - PRO
                    - ULTRA
                    - BUSINESS
                    - ENTERPRISE
                  tier_label:
                    type: string
                  subscription:
                    type: object
                    nullable: true
                    properties:
                      status:
                        type: string
                      billing_cycle:
                        type: string
                        enum:
                        - monthly
                        - annual
                      current_period_end:
                        type: string
                        format: date-time
                        nullable: true
                      started_at:
                        type: string
                        format: date-time
                  quota:
                    type: object
                    properties:
                      daily:
                        type: object
                      burst:
                        type: object
                  features:
                    type: object
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/XRateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/XRateLimitRemaining'
            X-RateLimit-Used:
              $ref: '#/components/headers/XRateLimitUsed'
            X-RateLimit-Reset:
              $ref: '#/components/headers/XRateLimitReset'
            X-Data-Delay:
              $ref: '#/components/headers/XDataDelay'
            X-MadeOnSol-Quota-Warning:
              $ref: '#/components/headers/XMadeOnSolQuotaWarning'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/TierForbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/AuthBackendUnavailable'
      x-madeonsol-tier: FREE
      x-badges:
      - name: FREE
        position: after
        color: '#64748b'
      operationId: getMe
      x-operation-id-source: derived
components:
  headers:
    XRateLimitReset:
      description: When the window resets, as a Unix epoch in SECONDS (next 00:00 UTC for the daily quota; about 60 s ahead for a per-minute bucket).
      schema:
        type: integer
      example: 1791158400
    XRateLimitRemaining:
      description: Calls left in that window. `0` on a quota 429.
      schema:
        type: integer
        minimum: 0
      example: 9412
    XDataDelay:
      description: 'Free-tier only: the feed in this body is delayed by this many seconds (same value as the body''s `delay_seconds`). Absent on real-time responses.'
      schema:
        type: integer
        minimum: 1
      example: 300
    XRateLimitLimit:
      description: 'Size of the rate-limit window this call was counted against: the daily quota for your tier on data endpoints, the per-minute bucket on `/stream/token` (10) and `/stream/sessions` (30), the hourly allowance for the public demo key. Sent once the key has been authenticated and rate-limited, so it is absent on authentication-stage errors.'
      schema:
        type: integer
        minimum: 0
      example: 10000
    XMadeOnSolQuotaWarning:
      description: 'Free-tier only, past about 70 % of the daily quota: a human-readable usage line with an upgrade link.'
      schema:
        type: string
      example: '150/200 used - upgrade for 50x higher limits: https://madeonsol.com/checkout?tier=PRO'
    XRequestId:
      description: Unique id of this response. On responses built after authentication it is also the `request_id` of the audit-log row for the call, so quote it in a support request. Present on every response of the keyed API.
      required: true
      schema:
        type: string
        format: uuid
      example: 3f6c1d2e-8a4b-4f7e-9c21-5b0d7e6a9f13
    XRateLimitUsed:
      description: Calls used in that window (`limit − remaining`).
      schema:
        type: integer
        minimum: 0
      example: 588
    RetryAfter:
      description: Seconds to wait before retrying (RFC 9110 delay-seconds, at least 1). Sent on every 429 (quota, concurrency, authentication-failure) and every 503; when the body carries `retry_after_seconds` it is the same value.
      required: true
      schema:
        type: integer
        minimum: 1
      example: 10
  schemas:
    DemoKeyNotAllowedError:
      type: object
      description: 403 for the public demo key (`msk_demo_…`) outside its three-endpoint allow-list. `endpoint_tier` is the endpoint's real minimum plan (null when unknown).
      required:
      - error
      - message
      - allowed_endpoints
      properties:
        error:
          type: string
          enum:
          - demo_key_endpoint_not_allowed
        message:
          type: string
        endpoint_tier:
          type: string
          nullable: true
          enum:
          - FREE
          - PRO
          - ULTRA
          - BUSINESS
          - ENTERPRISE
          - null
        allowed_endpoints:
          type: array
          items:
            type: string
        signup_url:
          type: string
          format: uri
        upgrade_url:
          type: string
          format: uri
          description: Only when the endpoint's tier can be bought at /checkout.
    ConcurrencyLimitError:
      type: object
      description: '429 from the heavy-query limiter: too many heavy requests in flight for this key (`concurrency`) or for the whole server (`capacity`). Clears as soon as in-flight requests finish.'
      required:
      - error
      - error_kind
      - retry_after_seconds
      properties:
        error:
          type: string
        error_kind:
          type: string
          enum:
          - concurrency
          - capacity
        retry_after_seconds:
          type: number
        max_concurrent:
          type: integer
        support:
          type: string
        _rid:
          type: string
    TierRequiredError:
      type: object
      description: 403 when the key's tier is below the endpoint's (or a parameter's) gate. `required_tier` matches the operation's `x-madeonsol-tier` or `x-madeonsol-feature-tiers`. ENTERPRISE gates return `contact` instead of `upgrade`.
      required:
      - error
      - message
      - your_tier
      - required_tier
      properties:
        error:
          type: string
          enum:
          - tier_required
        message:
          type: string
        feature:
          type: string
        your_tier:
          type: string
          enum:
          - BASIC
          - PRO
          - ULTRA
          - BUSINESS
          - ENTERPRISE
        required_tier:
          type: string
          enum:
          - PRO
          - ULTRA
          - BUSINESS
          - ENTERPRISE
        upgrade:
          type: object
          description: The plan that lifts this limit, with price and a checkout link.
          properties:
            tier:
              type: string
              enum:
              - PRO
              - ULTRA
              - BUSINESS
              - ENTERPRISE
            price_eur_per_month:
              type: number
            price_usdc_per_month:
              type: number
            daily_limit:
              type: integer
            burst_limit:
              type: integer
            pitch:
              type: string
            url:
              type: string
            upgrade_url:
              type: string
              format: uri
            reactivate:
              type: boolean
              description: Present (true) when the key's paid subscription has just lapsed and `tier` is the plan it held.
            prior_tier:
              type: string
              enum:
              - PRO
              - ULTRA
              - BUSINESS
        contact:
          type: object
          properties:
            url:
              type: string
            contact_url:
              type: string
            pitch:
              type: string
        support:
          type: string
        _rid:
          type: string
    ServiceUnavailableError:
      type: object
      description: '503: a temporary capacity or maintenance condition (e.g. a Postgres statement timeout during a partition move, or the API-key lookup itself being unavailable). Retry after `Retry-After` seconds.'
      required:
      - error
      properties:
        error:
          type: string
        code:
          type: string
          description: Machine-readable code where one exists, e.g. `auth_backend_unavailable`.
        error_kind:
          type: string
          description: e.g. `statement_timeout`, `auth_backend`
        retry_after_seconds:
          type: number
        retryable:
          type: boolean
        support:
          type: string
        _rid:
          type: string
    RateLimitError:
      type: object
      description: '429 when a quota is exhausted: the daily quota, the per-minute burst, or a free-tier network/key-rotation cap. `datasets` is added on `daily` only.'
      required:
      - error
      - error_kind
      - message
      - tier
      - limit
      - resets_at
      properties:
        error:
          type: string
          enum:
          - rate_limit_exceeded
        error_kind:
          type: string
          enum:
          - daily
          - burst
          - ip_cap
          - ip_rotation
        message:
          type: string
        tier:
          type: string
          enum:
          - BASIC
          - PRO
          - ULTRA
          - BUSINESS
          - ENTERPRISE
        limit:
          type: integer
        resets_at:
          type: string
          format: date-time
        upgrade:
          type: object
          description: The plan that lifts this limit, with price and a checkout link.
          properties:
            tier:
              type: string
              enum:
              - PRO
              - ULTRA
              - BUSINESS
              - ENTERPRISE
            price_eur_per_month:
              type: number
            price_usdc_per_month:
              type: number
            daily_limit:
              type: integer
            burst_limit:
              type: integer
            pitch:
              type: string
            url:
              type: string
            upgrade_url:
              type: string
              format: uri
            reactivate:
              type: boolean
              description: Present (true) when the key's paid subscription has just lapsed and `tier` is the plan it held.
            prior_tier:
              type: string
              enum:
              - PRO
              - ULTRA
              - BUSINESS
        datasets:
          type: object
          properties:
            pitch:
              type: string
            url:
              type: string
              format: uri
    Error:
      type: object
      description: Generic error envelope. `error` is always present (SDKs match on it). Errors returned after authentication also carry `_rid` and, on paid tiers, `support`; authentication-stage errors (missing/invalid key, origin) carry neither.
      properties:
        error:
          type: string
          description: Error message or machine code (e.g. `tier_required`, `rate_limit_exceeded`). Never changed once shipped.
        message:
          type: string
          description: Human-readable explanation, when `error` is a machine code.
        code:
          type: string
          description: Machine-readable sub-code on some errors (e.g. `invalid_query`, `invalid_wallet`, `origin_not_allowed`).
        error_kind:
          type: string
          description: Machine-readable category on some errors (e.g. `statement_timeout`, `concurrency`, `daily`).
        detail:
          type: string
          description: Extra human-readable context.
        hint:
          type: string
        retry_after_seconds:
          type: number
          description: When present on a 429/503, the same value is sent as the `Retry-After` header.
        signup_url:
          type: string
          format: uri
          description: 'On the missing-key / bad-format 401: where to get a free key.'
        docs_url:
          type: string
          format: uri
        support:
          type: string
          description: 'Paid tiers, errors after authentication: priority support contact.'
        _rid:
          type: string
          description: Request ID — include when reporting issues
      required:
      - error
  responses:
    TierForbidden:
      description: 'Forbidden. One of: the key''s tier is below this endpoint''s or parameter''s gate (`tier_required` with an `upgrade` block); the public demo key used outside its allow-list (`demo_key_endpoint_not_allowed`); an invalid or revoked key; an origin-restricted key called from a disallowed origin (`code` `origin_not_allowed` / `origin_required`). `X-RateLimit-*` headers are present only on `tier_required`.'
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
        X-RateLimit-Limit:
          $ref: '#/components/headers/XRateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/XRateLimitRemaining'
        X-RateLimit-Used:
          $ref: '#/components/headers/XRateLimitUsed'
        X-RateLimit-Reset:
          $ref: '#/components/headers/XRateLimitReset'
      content:
        application/json:
          schema:
            anyOf:
            - $ref: '#/components/schemas/TierRequiredError'
            - $ref: '#/components/schemas/DemoKeyNotAllowedError'
            - $ref: '#/components/schemas/Error'
          examples:
            tier_required:
              summary: Tier below the gate
              value:
                error: tier_required
                message: This endpoint requires ULTRA tier — you're on PRO.
                feature: This endpoint
                your_tier: PRO
                required_tier: ULTRA
                upgrade:
                  tier: ULTRA
                  price_eur_per_month: 131
                  price_usdc_per_month: 149
                  daily_limit: 100000
                  burst_limit: 600
                  pitch: …
                  url: https://madeonsol.com/pricing
                  upgrade_url: https://madeonsol.com/checkout?tier=ULTRA
                support: 'Priority support: info@madeonsol.com'
                _rid: eyJ1IjoiZXhhbXBsZSIsInQiOjE3OTEwMDAwMDAwMDAsImgiOiIwMDAwMDAwMCJ9
            demo_key:
              summary: Demo key outside its allow-list
              value:
                error: demo_key_endpoint_not_allowed
                message: The public demo key works on /kol/feed, /deployer-hunter/alerts, and /alpha/leaderboard only. This endpoint requires the PRO plan or higher; a free API key will not unlock it. See https://madeonsol.com/pricing.
                endpoint_tier: PRO
                allowed_endpoints:
                - /api/v1/kol/feed
                - /api/v1/deployer-hunter/alerts
                - /api/v1/alpha/leaderboard
                signup_url: https://madeonsol.com/developer
                upgrade_url: https://madeonsol.com/checkout?tier=PRO
            revoked_key:
              summary: Invalid or revoked key
              value:
                error: Invalid or revoked API key
    InternalError:
      description: Unexpected server error from the route (`Internal server error`, with `_rid`). Safe to retry with backoff. A failed API-key lookup is a 503 `auth_backend_unavailable`, never a 500.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
        X-RateLimit-Limit:
          $ref: '#/components/headers/XRateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/XRateLimitRemaining'
        X-RateLimit-Used:
          $ref: '#/components/headers/XRateLimitUsed'
        X-RateLimit-Reset:
          $ref: '#/components/headers/XRateLimitReset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            route:
              summary: Route error
              value:
                error: Internal server error
                _rid: eyJ1IjoiZXhhbXBsZSIsInQiOjE3OTEwMDAwMDAwMDAsImgiOiIwMDAwMDAwMCJ9
    RateLimited:
      description: Too many requests. Every 429 carries `Retry-After`. A quota 429 (`rate_limit_exceeded`, with `X-RateLimit-*`), a heavy-query concurrency 429 (`error_kind` `concurrency`/`capacity`), or the per-IP authentication-failure block (30 failed auths/min; plain `error` + `retry_after_seconds`, no `X-RateLimit-*`).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
        X-RateLimit-Limit:
          $ref: '#/components/headers/XRateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/XRateLimitRemaining'
        X-RateLimit-Used:
          $ref: '#/components/headers/XRateLimitUsed'
        X-RateLimit-Reset:
          $ref: '#/components/headers/XRateLimitReset'
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/json:
          schema:
            anyOf:
            - $ref: '#/components/schemas/RateLimitError'
            - $ref: '#/components/schemas/ConcurrencyLimitError'
            - $ref: '#/components/schemas/Error'
          examples:
            daily:
              summary: Daily quota exhausted
              value:
                error: rate_limit_exceeded
                error_kind: daily
                message: Daily rate limit exceeded — 200/day for BASIC tier. Resets at midnight UTC.
                tier: BASIC
                limit: 200
                resets_at: '2026-10-05T00:00:00.000Z'
                upgrade:
                  tier: PRO
                  price_eur_per_month: 43
                  price_usdc_per_month: 49
                  daily_limit: 10000
                  burst_limit: 300
                  pitch: …
                  url: https://madeonsol.com/pricing
                  upgrade_url: https://madeonsol.com/checkout?tier=PRO
                datasets:
                  pitch: …
                  url: https://madeonsol.com/datasets
            concurrency:
              summary: Too many heavy queries in flight
              value:
                error: Too many concurrent heavy queries. Up to 8 of these endpoints may be in flight at once per key — retry in a moment, or lower your request concurrency.
                error_kind: concurrency
                retry_after_seconds: 2
                max_concurrent: 8
                _rid: eyJ1IjoiZXhhbXBsZSIsInQiOjE3OTEwMDAwMDAwMDAsImgiOiIwMDAwMDAwMCJ9
            auth_failures:
              summary: Per-IP authentication-failure block
              value:
                error: Too many authentication failures from this IP. Retry in 60s.
                retry_after_seconds: 42
    AuthBackendUnavailable:
      description: 'The API-key or subscription lookup could not be answered (authentication stage). Retryable and not your fault: it is never counted as a failed authentication. Honour `Retry-After`; no `X-RateLimit-*`, no `_rid`.'
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ServiceUnavailableError'
          examples:
            auth_backend:
              summary: API-key lookup unavailable
              value:
                error: Authentication temporarily unavailable — please retry.
                code: auth_backend_unavailable
                error_kind: auth_backend
                retryable: true
                retry_after_seconds: 5
    Unauthorized:
      description: 'Missing or invalid API key, or an expired free-tier key. Authentication-stage error: no `X-RateLimit-*` headers, no `_rid`.'
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            missing_key:
              summary: No Bearer key
              value:
                error: 'Missing authentication — use API key (Authorization: Bearer msk_...)'
                hint: Get a free API key — 200 calls/day, no payment
                signup_url: https://madeonsol.com/developer
                docs_url: https://madeonsol.com/api-docs
            bad_format:
              summary: Malformed key
              value:
                error: Invalid API key format
                hint: Get a free API key — 200 calls/day, no payment
                signup_url: https://madeonsol.com/developer
                docs_url: https://madeonsol.com/api-docs
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: msk_...
      description: Get a free API key at https://madeonsol.com/developer
x-madeonsol-tiers:
- tier: FREE
  plan: BASIC
  name: Free
  price_eur_monthly: 0
  price_eur_annual: 0
  price_usd_monthly: 0
  daily_limit: 200
  burst_limit: 60
  url: https://madeonsol.com/developer
- tier: PRO
  plan: PRO
  name: Pro
  price_eur_monthly: 43
  price_eur_annual: 430
  price_usd_monthly: 49
  daily_limit: 10000
  burst_limit: 300
  url: https://madeonsol.com/checkout?tier=PRO
- tier: ULTRA
  plan: ULTRA
  name: Ultra
  price_eur_monthly: 131
  price_eur_annual: 1310
  price_usd_monthly: 149
  daily_limit: 100000
  burst_limit: 600
  url: https://madeonsol.com/checkout?tier=ULTRA
- tier: BUSINESS
  plan: BUSINESS
  name: Business
  price_eur_monthly: 400
  price_eur_annual: 4000
  price_usd_monthly: 456
  daily_limit: 500000
  burst_limit: 3000
  url: https://madeonsol.com/checkout?tier=BUSINESS
- tier: ENTERPRISE
  plan: ENTERPRISE
  name: Enterprise
  price_eur_monthly: null
  price_eur_annual: null
  price_usd_monthly: null
  daily_limit: null
  burst_limit: null
  url: https://madeonsol.com/pricing#enterprise