Valjean Specialty Requirements API

What a class of risk needs, before a file exists.

Operations 1

POST /requirements What Valjean will need for this risk #

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/valjeanspecialty:valjeanspecialty-requirements-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

valjeanspecialty-requirements-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Valjean Specialty agent Requirements API
  version: 1.0.0
  summary: Check appetite, send submissions, answer what's needed, follow files, get quotes and ask to bind.
  description: 'For retail agencies'' own software and AI assistants. Every key sees only its own agency''s files. A named Valjean broker works every file: chooses the markets, confirms anything you send, presents quotes and completes binding. Market names appear only on quotes your broker presents.'
  contact:
    name: Valjean Specialty
    email: submissions@valjeanspecialty.com
    url: https://valjeanspecialty.com
  license:
    name: 'Proprietary: for Valjean Specialty agencies'
    url: https://valjeanspecialty.com
  x-mcp:
    url: https://api.valjeanspecialty.com/api/mcp
    transport: streamable-http
    tools:
    - whoami
    - check_appetite
    - get_requirements
    - create_submission
    - list_submissions
    - get_submission
    - answer_questions
    - underwriter_questions
    - add_document
    - get_upload_link
    - finish_upload
    - send_documents
    - whats_new
    - list_documents
    - get_document_link
    - request_bind
    - list_bind_requests
    - withdraw_bind_request
    - ask_instant_quotes
    - list_policies
    - get_policy
    - list_invoices
    - list_quotes
servers:
- url: https://api.valjeanspecialty.com/api/agent/v1
  description: Live and demo (the key decides which book you see)
security:
- bearerAuth: []
- apiKeyHeader: []
- oauth2:
  - read
tags:
- name: Requirements
  description: What a class of risk needs, before a file exists.
paths:
  /requirements:
    post:
      operationId: getRequirements
      summary: What Valjean will need for this risk
      description: 'Everything the class needs before a file exists: the class checklist plus markets'' own asks, each with a key to answer by later and an answer type.


        Any key (read or read-and-submit).'
      tags:
      - Requirements
      x-valjean-scope: read
      security:
      - bearerAuth: []
      - apiKeyHeader: []
      - oauth2:
        - read
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                lines:
                  minItems: 1
                  maxItems: 6
                  type: array
                  items:
                    type: string
                    minLength: 1
                    maxLength: 60
                state:
                  type: string
                  minLength: 2
                  maxLength: 40
                naics:
                  type: string
                  pattern: ^[0-9]{2,6}$
                description:
                  type: string
                  maxLength: 300
              required:
              - lines
              - state
              additionalProperties: false
            example:
              lines:
              - GL
              - LL
              state: SC
              description: bar and grill
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Requirements'
              example:
                class_matched: Hospitality
                state: SC
                lines:
                - GL
                - LL
                items:
                - key: sales_split
                  label: 'Annual sales split: food vs liquor'
                  type: field
                  level: required
                  help: null
                  answer:
                    type: text
                - key: hours
                  label: Hours of operation and closing time
                  type: question
                  level: required
                  help: null
                  answer:
                    type: text
                - key: loss_runs
                  label: Currently valued loss runs – 5 years
                  type: document
                  level: required
                  help: null
                  answer:
                    type: file
          headers:
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '413':
          $ref: '#/components/responses/TooLarge'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/ServerError'
      x-codeSamples:
      - lang: shell
        label: curl
        source: "curl -X POST \"https://api.valjeanspecialty.com/api/agent/v1/requirements\" \\\n  -H \"Authorization: Bearer $VALJEAN_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"lines\":[\"GL\",\"LL\"],\"state\":\"SC\",\"description\":\"bar and grill\"}'"
      - lang: javascript
        label: Node
        source: "const res = await fetch(\"https://api.valjeanspecialty.com/api/agent/v1/requirements\", {\n  method: \"POST\",\n  headers: { Authorization: `Bearer ${process.env.VALJEAN_KEY}`, \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\n    \"lines\": [\n      \"GL\",\n      \"LL\"\n    ],\n    \"state\": \"SC\",\n    \"description\": \"bar and grill\"\n  }),\n});\nconsole.log(await res.json());"
      - lang: python
        label: Python
        source: "import os, requests\n\nres = requests.post(\n    \"https://api.valjeanspecialty.com/api/agent/v1/requirements\",\n    headers={\"Authorization\": f\"Bearer {os.environ['VALJEAN_KEY']}\"},\n    json={\n      \"lines\": [\n        \"GL\",\n        \"LL\"\n      ],\n      \"state\": \"SC\",\n      \"description\": \"bar and grill\"\n    },\n)\nprint(res.json())"
      x-agentic-access:
        action: read
        consequence: Reads only; changes nothing.
        human_in_the_loop: None needed.
        reversible: Nothing to undo.
        confirm_with_user: false
components:
  responses:
    Forbidden:
      description: 'Not allowed: read_only (a read key tried to submit), agency_not_active (no signed broker agreement), not_offered (instant quotes are off), forbidden (API access off for the agency). Don''t retry.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: read_only
              message: This key can read only. Ask your Valjean broker for a key that can submit.
    Unauthorized:
      description: 'Key or token missing, wrong, expired or revoked (unauthorized). Don''t retry: get a new key or sign in again.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: unauthorized
              message: This API key isn't valid. Ask your Valjean broker for a new one.
    BadRequest:
      description: Fix the request and send it again (invalid_request, invalid_json).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: invalid_request
              message: Check the request.
              issues:
              - 'insured.state: Too small: expected string to have >=2 characters'
    ServerError:
      description: Something went wrong on Valjean's side (server_error). Safe to retry later; creates are idempotent with client_reference or an Idempotency-Key header.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: server_error
              message: Something went wrong. Try again shortly.
    TooLarge:
      description: 'Body or file too large (too_large): JSON bodies up to 64 KB, direct uploads 4 MB, upload links 25 MB.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: too_large
              message: Files over 4 MB need an upload link.
    RateLimited:
      description: 'Too many requests (rate_limited): 120 a minute per key, 30 a minute per IP on public endpoints, counted across all of Valjean''s servers. Wait Retry-After seconds.'
      headers:
        Retry-After:
          description: Seconds to wait.
          schema:
            type: integer
            example: 60
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: rate_limited
              message: Too many requests. Try again in a minute.
  schemas:
    AnswerSpec:
      type: object
      properties:
        type:
          type: string
          description: How to answer. "file" means upload a document instead.
          enum:
          - text
          - number
          - money
          - percent
          - yes_no
          - choice
          - date
          - file
        options:
          type: array
          items:
            type: string
          description: 'For type "choice": the allowed answers.'
      required:
      - type
    Requirements:
      type: object
      properties:
        class_matched:
          type:
          - string
          - 'null'
        state:
          type: string
        lines:
          type: array
          items:
            type: string
        items:
          type: array
          items:
            $ref: '#/components/schemas/RequirementItem'
      required:
      - class_matched
      - state
      - lines
      - items
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: Machine-readable code, e.g. invalid_request, read_only, not_found, closed, rate_limited.
            message:
              type: string
              description: Plain-English explanation you can show a person.
            issues:
              type: array
              items:
                type: string
              description: 'Validation problems, as "field: problem" (400 invalid_request only).'
          required:
          - code
          - message
      required:
      - error
    RequirementItem:
      type: object
      properties:
        key:
          type: string
          description: Answer by this key later (PATCH /submissions/{id}/answers).
        label:
          type: string
        type:
          type: string
          description: 'Playbook item type: document, field, question or photo.'
          x-todo: Market-only asks report "document" here even when they are questions; see level vocabulary note.
        level:
          type: string
          description: How much it matters.
          enum:
          - required
          - sometimes
          - recommended
          - some markets
          x-todo: 'Three vocabularies exist (requirements: required/sometimes/recommended/some markets; needs: required/recommended; class guides: required/sometimes/helpful). Confirm the intended set.'
        help:
          type:
          - string
          - 'null'
        answer:
          $ref: '#/components/schemas/AnswerSpec'
      required:
      - key
      - label
      - type
      - level
      - help
      - answer
  headers:
    RateLimitPolicy:
      description: 'The rate limit for this key, as an IETF RateLimit-Policy: 120 requests (q) per 60-second window (w), counted across all of Valjean''s servers. Over it, you get 429 with Retry-After.'
      schema:
        type: string
        example: '"per-key";q=120;w=60'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: vjk_live_… / vjk_demo_… API key, or an OAuth access token (vjat_…)
      description: 'Send the key as `Authorization: Bearer vjk_…`. Keys come from your agency portal or your Valjean broker.'
    apiKeyHeader:
      type: apiKey
      in: header
      name: X-Api-Key
      description: The same API key in an X-Api-Key header, for tools that can't set Authorization.
    oauth2:
      type: oauth2
      description: 'For AI apps that connect by signing in. Authorization code flow with PKCE (S256 only), public clients (no secret), dynamic client registration at https://api.valjeanspecialty.com/oauth/register. Discovery: https://api.valjeanspecialty.com/.well-known/oauth-authorization-server. Access tokens last 1 hour; refresh tokens 30 days and rotate on use. Tokens stop when the API key or portal link that approved them is revoked.'
      flows:
        authorizationCode:
          authorizationUrl: https://api.valjeanspecialty.com/oauth/authorize
          tokenUrl: https://api.valjeanspecialty.com/oauth/token
          refreshUrl: https://api.valjeanspecialty.com/oauth/token
          scopes:
            read: Appetite, requirements, status, quotes, documents, policies
            submit: Also send files, answers, documents, bind requests and instant-quote asks
x-event-types:
- submission.received
- submission.status_changed
- needs.requested
- markets.updated
- quote.presented
- bind.status_changed
- policy.bound
- policy.status_changed
- document.available
- invoice.sent
- invoice.paid
- invoice.overdue