Malt · OpenAPI Overlay 1.0.0

API Evangelist enhancements for Malt Exposed APIs

15 actions 15 updates update extends openapi/malt-exposed-apis-openapi.yml
Derived by API Evangelist Built from the contracts Malt publishes. Malt did not publish this file.
View Overlay File View on GitHub Overlay Specification

What the actions change

x-apievangelist-notex-apievangelist-profilex-apievangelist-reviewedx-apievangelist-findingsx-apievangelist-idempotent

Targets 15

$.info
$.servers
$.paths['/freelancer/invoices'].get
$.paths['/freelancer/invoices/{id}/pdf'].get
$.paths['/freelancer/fee-invoices'].get
$.paths['/freelancer/payments'].get
$.paths['/scim/v2/Users'].post
$.paths['/scim/v2/Users/{userId}'].patch
$.paths['/scim/v2/Users/{userId}'].delete
$.components.schemas.InvoiceResource
$.components.schemas.CustomerResource
$.components.schemas.SupplierResource
$.components.schemas.MaltUserExtension
$.components.schemas.ErrorResponse
$.components.schemas.PageResource

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancements for Malt Exposed APIs
  version: 1.0.0
extends: openapi/malt-exposed-apis-openapi.yml
x-generated: '2026-08-17'
x-method: generated
x-source: >-
  Derived from the artifacts in this repository against the verbatim spec at
  openapi/_original/malt-unified-exposed-apis-openapi.json (fetched from
  https://api.malt.com/unified-exposed-apis.json). The original document is never mutated.
actions:
- target: $.info
  update:
    x-apievangelist-profile: https://apis.io/provider/malt
    x-apievangelist-reviewed: '2026-08-17'
    x-apievangelist-note: >-
      Two disjoint capability groups on one host: a bespoke read-only freelancer billing surface
      and a standards-conformant SCIM 2.0 user-provisioning surface. A client needs two sets of
      conventions.
    x-apievangelist-findings:
    - >-
      Global `security` is an empty array and the seven /freelancer/* operations declare no
      security requirement, although the guidelines state that all APIs require a token. Only the
      six SCIM operations reference ApiKeyAuth.
    - >-
      The declared BearerAuth (http/bearer, JWT) scheme is never applied to any operation, and the
      prose documents a BARE token (`Authorization: your-api-token-here`) rather than a
      `Bearer ` prefix. The two disagree.
    - >-
      info.version is 0.0.1 on a document describing a live production API.
    - >-
      No 4xx response declares a body; no 5xx response is declared anywhere; no 429 exists even
      though the guidelines promise a rate-limiting section.
    - >-
      The ErrorResponse schema (SCIM-shaped: schemas/scimType/status/detail) is defined and
      referenced by nothing.
    - >-
      The PageResource paging envelope is defined but only used by the SCIM surface; the three
      billing list operations return unpaged arrays.
    - >-
      The three SCIM write operations declare requestBody content as `*/*` rather than
      application/json or application/scim+json.
- target: $.servers
  update:
  - url: https://api.malt.com
    description: Production API server
    x-apievangelist-verified: '2026-08-17'
    x-apievangelist-probe: >-
      GET /freelancer/invoices?since=2026-01-01 and GET /scim/v2/Users both returned HTTP 401 with
      an empty body, confirming both surfaces are live and credential-gated at this host.
- target: $.paths['/freelancer/invoices'].get
  update:
    x-apievangelist-note: >-
      Unpaged. Returns the full result set for the date window; a wide `since` on a long history
      returns one unbounded response. No cursor, page, offset or limit parameter exists.
- target: $.paths['/freelancer/invoices/{id}/pdf'].get
  update:
    x-apievangelist-note: >-
      Despite the name, the 200 response is application/json returning PDFInvoiceResource with the
      document base64-encoded in a `pdf` field — not a binary application/pdf stream.
- target: $.paths['/freelancer/fee-invoices'].get
  update:
    x-apievangelist-note: >-
      Filters on since/until, but the FeeInvoiceResource it returns carries NO date field at all —
      the attribute the query filters on is not present in the response.
- target: $.paths['/freelancer/payments'].get
  update:
    x-apievangelist-note: >-
      PaymentResource carries an id but there is no GET /freelancer/payments/{id}, so a payment is
      list-only and its id cannot be re-resolved.
- target: $.paths['/scim/v2/Users'].post
  update:
    x-apievangelist-note: >-
      No idempotency key. A retry after a network timeout can create a duplicate user. Confirm via
      GET /scim/v2/Users with a `filter` on userName before retrying.
    x-apievangelist-idempotent: false
- target: $.paths['/scim/v2/Users/{userId}'].patch
  update:
    x-apievangelist-note: >-
      Malt accepts only one PATCH operation — setting `active` to false. Treat this endpoint as
      "deactivate user", not as general SCIM PATCH.
- target: $.paths['/scim/v2/Users/{userId}'].delete
  update:
    x-apievangelist-note: >-
      Returns 403 when the user has platform activity. Deactivation via PATCH is the supported
      path for offboarding.
- target: $.components.schemas.InvoiceResource
  update:
    x-apievangelist-note: >-
      Carries no currency field. Amounts are unlabelled in the contract; currency appears only on
      PaymentResource.
- target: $.components.schemas.CustomerResource
  update:
    x-apievangelist-note: >-
      Inline value object with no `id` and no operations — customers cannot be listed, fetched or
      joined except by matching name / registrationNumber / vatNumber strings.
- target: $.components.schemas.SupplierResource
  update:
    x-apievangelist-note: >-
      Same shape and same limitation as CustomerResource; one party schema reused for both sides of
      the transaction.
- target: $.components.schemas.MaltUserExtension
  update:
    x-apievangelist-note: >-
      The single Malt-specific SCIM attribute (urn:ietf:params:scim:schemas:extension:malt:2.0:User).
      companyAttributionId ties a provisioned user to the buying company's cost-attribution scheme.
- target: $.components.schemas.ErrorResponse
  update:
    x-apievangelist-note: >-
      Orphaned. SCIM-shaped error object referenced by no operation; every declared 4xx has empty
      content.
- target: $.components.schemas.PageResource
  update:
    x-apievangelist-note: >-
      Used only by the SCIM ListResponse (UserPage). The billing list operations never reference it.

Work with this as data

Every overlay 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 openapi overlays

4 MCP tools reach this
  • find_overlaysBrowse and filter every overlay in the catalog.
  • 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 overlay
curl "https://apis.io/api/v1/overlays/malt-exposed-apis-overlay"
All openapi overlays
curl "https://apis.io/api/v1/overlays?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.