{
  "info": {
    "name": "VERIS API",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "description": "Managed AI request routing. Set the `baseUrl` and `apiKey` collection variables before running. Start with Health to prove reachability, then Chat, then Embeddings."
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://veris.digital/api/v1"
    },
    {
      "key": "apiKey",
      "value": "veris_xxxxxxxx_replace_me"
    }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "item": [
    {
      "name": "Health",
      "request": {
        "method": "GET",
        "description": "Auth-free reachability probe. Returns `{status:'ok',version,capabilities,timestamp}`. Run this first. If it fails, no other request will work.",
        "url": {
          "raw": "{{baseUrl}}/api/v1/health",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "health"
          ]
        },
        "auth": {
          "type": "noauth"
        }
      }
    },
    {
      "name": "Chat: simple prompt",
      "request": {
        "method": "POST",
        "description": "Send a single prompt through the router. Returns provider/model choice, text, tokens, latency, and cost.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/v1/chat",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "chat"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"application\": \"resume-parser\",\n  \"environment\": \"production\",\n  \"workload\": \"extract\",\n  \"input\": \"Extract name, email, and years of experience from this resume.\"\n}"
        }
      }
    },
    {
      "name": "Chat: multi-turn messages",
      "request": {
        "method": "POST",
        "description": "Multi-turn conversation with a system prompt and a cost cap. The router picks the best provider that satisfies `maxCostUsd`.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/v1/chat",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "chat"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"application\": \"resume-parser\",\n  \"environment\": \"production\",\n  \"workload\": \"extract\",\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"You are a resume parser. Reply with JSON.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"Extract name, email, and years of experience from this resume.\"\n    }\n  ],\n  \"maxCostUsd\": 0.05\n}"
        }
      }
    },
    {
      "name": "Embeddings",
      "request": {
        "method": "POST",
        "description": "OpenAI-compatible embeddings endpoint. `input` may be a single string or an array. Returns `{object:'list', data:[{embedding,...}], usage, ...}`.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/v1/embeddings",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "embeddings"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"application\": \"resume-parser\",\n  \"environment\": \"production\",\n  \"input\": \"Senior software engineer with 8 years of backend experience.\"\n}"
        }
      }
    },
    {
      "name": "Document OCR",
      "request": {
        "method": "POST",
        "description": "Read the text of a document, page by page. Send the file as inline base64 or as a permitted HTTPS URL. The response reports pages read, pages that failed, and the provider's own charge in its own currency.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/v1/document/ocr",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "document",
            "ocr"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"application\": \"resume-parser\",\n  \"environment\": \"production\",\n  \"document\": {\n    \"source\": \"url\",\n    \"mime_type\": \"application/pdf\",\n    \"url\": \"https://example.com/invoice.pdf\"\n  }\n}"
        }
      }
    },
    {
      "name": "Document Extract",
      "request": {
        "method": "POST",
        "description": "Pull named fields out of a document. Send the file as inline base64 or as a permitted HTTPS URL, and name the fields you want in `schema`. The response returns the resolved values plus per-value confidence and source pages when the provider reports them, page counts, and the provider's own charge in its own currency.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/v1/document/extract",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "document",
            "extract"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"application\": \"resume-parser\",\n  \"environment\": \"production\",\n  \"document\": {\n    \"source\": \"url\",\n    \"mime_type\": \"application/pdf\",\n    \"url\": \"https://example.com/invoice.pdf\"\n  },\n  \"schema\": {\n    \"invoice_number\": \"string\",\n    \"total\": \"number\"\n  }\n}"
        }
      }
    },
    {
      "name": "Rerank",
      "request": {
        "method": "POST",
        "description": "Reorder candidate documents by relevance to a query. `index` in each result is the position in the `documents` array you sent, so you can join the ranking straight back onto your own data. Requires a model VERIS has verified for rerank; until one is connected the request is rejected with an explanation.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/v1/rerank",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "rerank"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"application\": \"resume-parser\",\n  \"environment\": \"production\",\n  \"model\": \"veris-auto\",\n  \"query\": \"Which candidate has backend experience?\",\n  \"documents\": [\n    \"Senior software engineer with 8 years of backend experience.\",\n    \"Graphic designer with a focus on brand identity.\",\n    \"Frontend engineer who has shipped some Node services.\"\n  ],\n  \"top_n\": 2\n}"
        }
      }
    },
    {
      "name": "Image: generate",
      "request": {
        "method": "POST",
        "description": "Synchronous image generation. Returns described artifacts: `delivery:'inline'` carries base64 bytes, `delivery:'url'` carries a provider link that expires — download it if you need to keep it.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/v1/images/generations",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "images",
            "generations"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"application\": \"resume-parser\",\n  \"environment\": \"production\",\n  \"prompt\": \"A watercolor fox in a snowy forest\",\n  \"size\": \"1024x1024\"\n}"
        }
      }
    },
    {
      "name": "Speech: text to speech",
      "request": {
        "method": "POST",
        "description": "Synthesize speech. The audio comes back as an artifact next to the routing decision, request id and cost provenance, so the same response tells you what was said and what it cost.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/v1/audio/speech",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "audio",
            "speech"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"application\": \"resume-parser\",\n  \"environment\": \"production\",\n  \"input\": \"Your resume has been processed.\",\n  \"language\": \"en-IN\",\n  \"response_format\": \"wav\"\n}"
        }
      }
    },
    {
      "name": "Speech: transcribe audio",
      "request": {
        "method": "POST",
        "description": "Speech to text. Use this form-data request to upload a file, or send JSON with `audio_b64` and `audio_mime_type`. Inline audio is limited to 20 MB per request.",
        "header": [],
        "url": {
          "raw": "{{baseUrl}}/api/v1/audio/transcriptions",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "audio",
            "transcriptions"
          ]
        },
        "body": {
          "mode": "formdata",
          "formdata": [
            {
              "key": "application",
              "value": "resume-parser",
              "type": "text"
            },
            {
              "key": "environment",
              "value": "production",
              "type": "text"
            },
            {
              "key": "language",
              "value": "en-IN",
              "type": "text"
            },
            {
              "key": "file",
              "src": [],
              "type": "file"
            }
          ]
        }
      }
    },
    {
      "name": "Video: submit job",
      "request": {
        "method": "POST",
        "description": "Video runs longer than a request should be held open, so this returns `202` with a `job_id`. Send an `Idempotency-Key` so a retried submission returns the same job instead of a second one, then poll the job endpoint.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Idempotency-Key",
            "value": "{{$guid}}"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/v1/video/generations",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "video",
            "generations"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"application\": \"resume-parser\",\n  \"environment\": \"production\",\n  \"prompt\": \"A slow dolly across a snowy forest at dawn\",\n  \"duration_seconds\": 6,\n  \"size\": \"1280x720\"\n}"
        }
      }
    },
    {
      "name": "Video: poll job",
      "request": {
        "method": "GET",
        "description": "Read the submitted job. `queued` and `running` mean keep polling; `completed` carries the artifacts and cost; `failed` carries the canonical error code. Replace `:jobId` with the id returned by the submit request.",
        "url": {
          "raw": "{{baseUrl}}/api/v1/video/generations/:jobId",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "video",
            "generations",
            ":jobId"
          ],
          "variable": [
            {
              "key": "jobId",
              "value": "6f1c1f0e-1a5e-4b6c-9a2f-6a1b0c2d3e4f",
              "description": "job_id from the submit response"
            }
          ]
        }
      }
    },
    {
      "name": "Ingestion fingerprint",
      "request": {
        "method": "POST",
        "description": "Ask whether this exact document was already ingested for this application. `reused:true` returns your own artifact reference, so you skip parsing, chunking and embedding. Send `artifact_ref` to register a freshly ingested document.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/v1/ingestion/fingerprint",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "ingestion",
            "fingerprint"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"application\": \"resume-parser\",\n  \"environment\": \"production\",\n  \"document_hash\": \"sha256:2f1c9b4e8a0d5f37c6e2b91a4d8f0c73e5a6b1d92f84c0e7a3b5d6f18c9e2740\",\n  \"parser_version\": \"pdf-2\",\n  \"chunking_version\": \"v3\"\n}"
        }
      }
    },
    {
      "name": "Models",
      "request": {
        "method": "GET",
        "description": "List the models this key can actually route to, scoped to its application. Same eligibility truth as routing, not a global catalogue.",
        "url": {
          "raw": "{{baseUrl}}/api/v1/models?application=resume-parser",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "models"
          ],
          "query": [
            {
              "key": "application",
              "value": "resume-parser"
            },
            {
              "key": "environment",
              "value": "production",
              "disabled": true
            }
          ]
        }
      }
    },
    {
      "name": "Re-index progress callback",
      "request": {
        "method": "POST",
        "description": "Report progress for a VERIS-driven re-embedding run. Replace `:jobId` with the job id VERIS delivered. Reporting `completed` is what flips the embedding index lock to the new model.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/v1/reindex/:jobId",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "reindex",
            ":jobId"
          ],
          "variable": [
            {
              "key": "jobId",
              "value": "00000000-0000-0000-0000-000000000000"
            }
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"status\": \"running\",\n  \"itemsDone\": 4200,\n  \"itemsTotal\": 18000\n}"
        }
      }
    },
    {
      "name": "OpenAPI spec",
      "request": {
        "method": "GET",
        "description": "Machine-readable reference for every live endpoint.",
        "url": {
          "raw": "{{baseUrl}}/api/v1/openapi",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "v1",
            "openapi"
          ]
        }
      }
    }
  ]
}