{
  "info": {
    "name": "ITManagerJobs Public API (v1)",
    "description": "Stable public surface for ATS integrations and partner automation.\n\nSet the `base_url` and `api_key` collection variables (or import the matching environment) before running requests. Every request authenticates via `Authorization: Bearer {{api_key}}`. Endpoints are tenant-scoped to the key's employer; cross-tenant calls return 404.\n\n**Scopes**\n- `JobPosting` — Jobs folder\n- `Applications` — Applications, Tags, Notes, Scorecards folders\n- `CvSearch` — Candidates folder",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "_postman_id": "itmj-public-api-v1"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      { "key": "token", "value": "{{api_key}}", "type": "string" }
    ]
  },
  "variable": [
    { "key": "base_url", "value": "https://itmanagerjobs.com" },
    { "key": "api_key",  "value": "pk_live_REPLACE_ME" },
    { "key": "candidate_api_key", "value": "pk_live_REPLACE_ME_CANDIDATE" },
    { "key": "job_id",         "value": "1" },
    { "key": "application_id", "value": "1" },
    { "key": "candidate_id",   "value": "1" },
    { "key": "note_id",        "value": "1" }
  ],
  "item": [
    {
      "name": "Jobs",
      "description": "JobPosting scope. CRUD + publish lifecycle.",
      "item": [
        {
          "name": "List jobs",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/api/v1/jobs?page=1&pageSize=50",
              "host": ["{{base_url}}"],
              "path": ["api","v1","jobs"],
              "query": [
                { "key": "page",     "value": "1" },
                { "key": "pageSize", "value": "50" },
                { "key": "status",   "value": "Active", "disabled": true }
              ]
            }
          }
        },
        {
          "name": "Get one job",
          "request": {
            "method": "GET",
            "url": "{{base_url}}/api/v1/jobs/{{job_id}}"
          }
        },
        {
          "name": "Create a draft job",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "url": "{{base_url}}/api/v1/jobs",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Senior Platform Engineer\",\n  \"reference\": \"PL-001\",\n  \"description\": \"Build and run the platform. Work on meaningful problems with a supportive team and a modern stack. Remote-friendly, outcome-driven, production-grade engineering from day one.\",\n  \"city\": \"London\",\n  \"state\": \"England\",\n  \"country\": \"United Kingdom\",\n  \"employmentType\": \"FullTime\",\n  \"remoteType\": \"HybridRemote\",\n  \"salaryMin\": 80000,\n  \"salaryMax\": 100000,\n  \"salaryCurrency\": \"GBP\",\n  \"salaryPeriod\": \"Annual\",\n  \"applyMethod\": \"EmailApply\",\n  \"applyEmailAddress\": \"jobs@example.com\"\n}"
            }
          }
        },
        {
          "name": "Update a job (patch)",
          "request": {
            "method": "PUT",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "url": "{{base_url}}/api/v1/jobs/{{job_id}}",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"salaryMax\": 110000\n}"
            }
          }
        },
        {
          "name": "Publish a job (consumes 1 JobPosting credit)",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "url": "{{base_url}}/api/v1/jobs/{{job_id}}/publish",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"expiryDate\": \"2026-12-31T00:00:00Z\"\n}"
            }
          }
        },
        {
          "name": "Deactivate a job",
          "request": {
            "method": "DELETE",
            "url": "{{base_url}}/api/v1/jobs/{{job_id}}"
          }
        }
      ]
    },

    {
      "name": "Applications",
      "description": "Applications scope. Read the applicant pipeline, the AI suitability assessment, and move candidates through stages.",
      "item": [
        {
          "name": "List applications for a job",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/api/v1/jobs/{{job_id}}/applications?page=1&pageSize=50",
              "host": ["{{base_url}}"],
              "path": ["api","v1","jobs","{{job_id}}","applications"],
              "query": [
                { "key": "page",     "value": "1" },
                { "key": "pageSize", "value": "50" },
                { "key": "status",   "value": "New", "disabled": true }
              ]
            }
          }
        },
        {
          "name": "Get one application",
          "request": {
            "method": "GET",
            "url": "{{base_url}}/api/v1/applications/{{application_id}}"
          }
        },
        {
          "name": "Get AI assessment for one application",
          "request": {
            "method": "GET",
            "url": "{{base_url}}/api/v1/applications/{{application_id}}/ai-assessment"
          }
        },
        {
          "name": "Move application to a new stage",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "url": "{{base_url}}/api/v1/applications/{{application_id}}/status",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"Shortlisted\",\n  \"note\": \"Top of stack — book a screen\"\n}"
            }
          }
        }
      ]
    },

    {
      "name": "Tags",
      "description": "Applications scope. Free-text labels per candidate (employer-scoped; auto-created on first assign; case-folded).",
      "item": [
        {
          "name": "List employer tag dictionary",
          "request": { "method": "GET", "url": "{{base_url}}/api/v1/tags" }
        },
        {
          "name": "List tags on an application",
          "request": { "method": "GET", "url": "{{base_url}}/api/v1/applications/{{application_id}}/tags" }
        },
        {
          "name": "Assign a tag to an application",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "url": "{{base_url}}/api/v1/applications/{{application_id}}/tags",
            "body": { "mode": "raw", "raw": "{\n  \"label\": \"hot\"\n}" }
          }
        },
        {
          "name": "Unassign a tag",
          "request": {
            "method": "DELETE",
            "url": "{{base_url}}/api/v1/applications/{{application_id}}/tags/hot"
          }
        }
      ]
    },

    {
      "name": "Notes",
      "description": "Applications scope. Recruiter-only notes; attributed to the user who minted the API key.",
      "item": [
        {
          "name": "List notes for an application",
          "request": { "method": "GET", "url": "{{base_url}}/api/v1/applications/{{application_id}}/notes" }
        },
        {
          "name": "Create a note",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "url": "{{base_url}}/api/v1/applications/{{application_id}}/notes",
            "body": { "mode": "raw", "raw": "{\n  \"body\": \"Strong on Kubernetes; asked about relocation — declined.\"\n}" }
          }
        },
        {
          "name": "Edit a note (author only)",
          "request": {
            "method": "PUT",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "url": "{{base_url}}/api/v1/notes/{{note_id}}",
            "body": { "mode": "raw", "raw": "{\n  \"body\": \"Updated note text.\"\n}" }
          }
        },
        {
          "name": "Delete a note (author only)",
          "request": { "method": "DELETE", "url": "{{base_url}}/api/v1/notes/{{note_id}}" }
        }
      ]
    },

    {
      "name": "Scorecards",
      "description": "Applications scope. One scorecard per (application, author, stage) — upsert semantics.",
      "item": [
        {
          "name": "List scorecards on an application",
          "request": { "method": "GET", "url": "{{base_url}}/api/v1/applications/{{application_id}}/scorecards" }
        },
        {
          "name": "Upsert this user's scorecard for a stage",
          "request": {
            "method": "PUT",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "url": "{{base_url}}/api/v1/applications/{{application_id}}/scorecards/Interviewed",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"recommendation\": \"StrongYes\",\n  \"rationale\": \"Nailed every system-design ask, strong communicator.\"\n}"
            }
          }
        },
        {
          "name": "Delete this user's scorecard for a stage",
          "request": {
            "method": "DELETE",
            "url": "{{base_url}}/api/v1/applications/{{application_id}}/scorecards/Interviewed"
          }
        }
      ]
    },

    {
      "name": "Me (Candidate self)",
      "description": "Candidate-issued API key (`{{candidate_api_key}}`). Scopes: `Profile`, `Applications`. Each call only ever resolves to the owning candidate's own data.",
      "auth": {
        "type": "bearer",
        "bearer": [{ "key": "token", "value": "{{candidate_api_key}}", "type": "string" }]
      },
      "item": [
        {
          "name": "Get my profile",
          "request": { "method": "GET", "url": "{{base_url}}/api/v1/me/profile" }
        },
        {
          "name": "Update my profile (patch)",
          "request": {
            "method": "PUT",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "url": "{{base_url}}/api/v1/me/profile",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"headline\": \"Senior Platform Engineer\",\n  \"summary\": \"15 years building production systems on the JVM and .NET.\",\n  \"desiredJobTitle\": \"Staff Engineer\",\n  \"careerStatus\": \"OpenToOffers\",\n  \"expectedSalaryMin\": 95000,\n  \"expectedSalaryMax\": 120000,\n  \"expectedSalaryCurrency\": \"GBP\",\n  \"expectedSalaryPeriod\": \"Annual\",\n  \"willRelocate\": false\n}"
            }
          }
        },
        {
          "name": "List my applications",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/api/v1/me/applications?page=1&pageSize=50",
              "host": ["{{base_url}}"],
              "path": ["api","v1","me","applications"],
              "query": [
                { "key": "page",     "value": "1" },
                { "key": "pageSize", "value": "50" },
                { "key": "status",   "value": "Interviewing", "disabled": true }
              ]
            }
          }
        },
        {
          "name": "Get one of my applications",
          "request": {
            "method": "GET",
            "url": "{{base_url}}/api/v1/me/applications/{{application_id}}"
          }
        },
        {
          "name": "Apply to a job (AI-assisted, requires Apply scope)",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "url": "{{base_url}}/api/v1/me/applications",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"jobId\": {{job_id}},\n  \"confirm\": true,\n  \"coverLetter\": \"Quick note from the candidate — I'm strong on Kubernetes and the salary band works.\"\n}"
            },
            "description": "Phase 1C safeguarded apply. `confirm` MUST be true (a missing flag returns 400). Rate-limited to 10 successful applies per UTC day per candidate; a 429 carries a Retry-After header. Successful submissions surface to the recruiter with an \"AI-assisted\" badge."
          }
        }
      ]
    },

    {
      "name": "Candidates (CV Search)",
      "description": "CvSearch scope. Boolean search returns masked rows (no contact details); a per-id GET unlocks the full profile (1 CV Download credit, free for 30 days after).",
      "item": [
        {
          "name": "Search candidates",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "url": "{{base_url}}/api/v1/candidates/search",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"query\": \"\\\"Process Engineer\\\" AND \\\"HVAC\\\"\",\n  \"preferredCountryIds\": [44],\n  \"activeWithinDays\": 90,\n  \"pageNumber\": 1,\n  \"pageSize\": 20\n}"
            }
          }
        },
        {
          "name": "Get full candidate profile (uses or consumes an unlock)",
          "request": {
            "method": "GET",
            "url": "{{base_url}}/api/v1/candidates/{{candidate_id}}"
          }
        }
      ]
    }
  ]
}
