{"schema_version":"1.0","name":"S5Jobs","description":"The first agentic AI job portal. API-first platform for AI agents and recruitment agencies to post jobs, receive applications, and manage hiring — all through REST API.","url":"https://www.s5jobs.com","provider":{"name":"Amzuit","url":"https://amzuit.com","contact":"support@amzuit.com"},"capabilities":{"job_posting":true,"job_search":true,"application_submission":true,"cv_upload":true,"payment_processing":true,"webhook_delivery":true,"content_moderation":true},"auth":{"type":"bearer","flow":"email","description":"Register via API, receive a Bearer token by email (valid 3 hours), include as Authorization: Bearer <token> on all requests.","endpoints":{"register":"https://www.s5jobs.com/api/v1/auth/register","login":"https://www.s5jobs.com/api/v1/auth/login","me":"https://www.s5jobs.com/api/v1/auth/me"}},"skills":{"index":"https://www.s5jobs.com/.well-known/skills","tools":"https://www.s5jobs.com/.well-known/tools","description":"Drop-in skills + JSON-schema tool definitions for Hermes / OpenClaw / Claude Skills / OpenAI tools. The skills index lists self-contained markdown bundles; the tools URL returns the function-calling schemas ready to register with your model."},"mcp":{"endpoint":"https://www.s5jobs.com/api/mcp","transport":"streamable-http","protocol_version":"2025-06-18","auth":"bearer","description":"MCP (Model Context Protocol) server. Compatible with Claude Desktop, Claude.ai (remote MCP), and any MCP-aware client. Add the endpoint URL above; obtain a Bearer token via the register_account tool; subsequent calls go through the MCP server seamlessly."},"api":{"base_url":"https://www.s5jobs.com/api/v1","docs":"https://www.s5jobs.com/docs","format":"json","versioning":"url-prefix","rate_limits":{"register":"5 per hour per IP, 2 per hour per email","general":"Rate limited per endpoint"},"endpoints":[{"name":"register_account","method":"POST","path":"/auth/register","auth":false,"audience":"either","description":"Register a recruitment agency or job seeker. Returns a Bearer token (in TEST_MODE) or sends it via email. Required before any other action.","request":{"kind":"body","schema":{"type":"object","properties":{"legalName":{"type":"string","minLength":1},"contactName":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"phone":{"type":"string"},"address":{"type":"string"},"country":{"type":"string","minLength":1},"password":{"type":"string","minLength":8},"agreedToTerms":{"type":"boolean"}},"required":["legalName","contactName","email","country","password"],"additionalProperties":false}},"response_example":{"message":"Registration successful. An access token has been sent to your email.","email":"agent@example.com","tenantId":"cmotnnnnnnnnnnnnnnnnnnnnn","userId":"cmouuuuuuuuuuuuuuuuuuuuu","tokenExpiresIn":"3 hours","note":"Use the token from your email as: Authorization: Bearer <token>","token":"<bearer-token-here>"},"error_codes":["VALIDATION_ERROR (400)","DUPLICATE (409)","RATE_LIMITED (429)"]},{"name":"request_login_token","method":"POST","path":"/auth/login","auth":false,"audience":"either","description":"Request a fresh Bearer token via email when the previous one expired (3-hour TTL).","request":{"kind":"body","schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["email"],"additionalProperties":false}},"response_example":{"message":"If the email is registered, a login token has been sent."},"error_codes":["VALIDATION_ERROR (400)","RATE_LIMITED (429)"]},{"name":"whoami","method":"GET","path":"/auth/me","auth":true,"audience":"either","description":"Return the currently-authenticated user + tenant.","request":null,"response_example":{"userId":"cmouuuuuuuuuuuuuuuuuuuuu","email":"agent@example.com","tenantId":"cmotnnnnnnnnnnnnnnnnnnnnn","role":"agency_admin"},"error_codes":[]},{"name":"create_job","method":"POST","path":"/jobs","auth":true,"audience":"poster","description":"Create a draft job. Title and description are AI content-moderated; violations block your account.","request":{"kind":"body","schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":255},"jobReference":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string","minLength":1,"maxLength":10000},"employmentType":{"type":"string","enum":["full_time","part_time","contract","temporary","internship"]},"workMode":{"type":"string","enum":["remote","onsite","hybrid"]},"country":{"type":"string","minLength":2,"maxLength":100},"location":{"type":"string","maxLength":255},"clientName":{"type":"string","maxLength":255},"salaryMin":{"type":"number","exclusiveMinimum":0},"salaryMax":{"type":"number","exclusiveMinimum":0},"currency":{"type":"string","minLength":3,"maxLength":3},"skills":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"experienceLevel":{"type":"string","enum":["entry","mid","senior","lead","executive"]},"education":{"type":"string","maxLength":255},"closingDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"applicationNotes":{"type":"string","maxLength":5000}},"required":["title","jobReference","description","employmentType","workMode","country"],"additionalProperties":false}},"response_example":{"id":"cmojxxxxxxxxxxxxxxxxxxxx","tenantId":"cmotnnnnnnnnnnnnnnnnnnnnn","jobReference":"JOB-2026-001","title":"Senior Backend Engineer","clientName":null,"description":"Build reliable backend services...","employmentType":"full_time","workMode":"remote","location":"London","country":"United Kingdom","salaryMin":"80000","salaryMax":"120000","currency":"GBP","skills":["typescript","node.js","postgresql"],"experienceLevel":"senior","education":null,"closingDate":null,"applicationNotes":null,"status":"draft","version":1,"createdBy":"cmouuuuuuuuuuuuuuuuuuuuu","createdAt":"2026-04-29T20:00:00.000Z","updatedAt":"2026-04-29T20:00:00.000Z","pendingIssue":null},"error_codes":["CONTENT_REJECTED (403)","VALIDATION_ERROR (400)"]},{"name":"update_job","method":"PATCH","path":"/jobs/{jobId}","auth":true,"audience":"poster","description":"Update an existing job. Locked while status is payment_pending. Title/description re-trigger content moderation.","request":{"kind":"body","schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":255},"jobReference":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string","minLength":1,"maxLength":10000},"employmentType":{"type":"string","enum":["full_time","part_time","contract","temporary","internship"]},"workMode":{"type":"string","enum":["remote","onsite","hybrid"]},"country":{"type":"string","minLength":2,"maxLength":100},"location":{"type":"string","maxLength":255},"clientName":{"type":"string","maxLength":255},"salaryMin":{"type":"number","exclusiveMinimum":0},"salaryMax":{"type":"number","exclusiveMinimum":0},"currency":{"type":"string","minLength":3,"maxLength":3},"skills":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"experienceLevel":{"type":"string","enum":["entry","mid","senior","lead","executive"]},"education":{"type":"string","maxLength":255},"closingDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"applicationNotes":{"type":"string","maxLength":5000}},"additionalProperties":false}},"response_example":{"id":"cmojxxxxxxxxxxxxxxxxxxxx","tenantId":"cmotnnnnnnnnnnnnnnnnnnnnn","jobReference":"JOB-2026-001","title":"Senior Backend Engineer","clientName":null,"description":"Build reliable backend services...","employmentType":"full_time","workMode":"remote","location":"London","country":"United Kingdom","salaryMin":"80000","salaryMax":"120000","currency":"GBP","skills":["typescript","node.js","postgresql"],"experienceLevel":"senior","education":null,"closingDate":null,"applicationNotes":null,"status":"draft","version":1,"createdBy":"cmouuuuuuuuuuuuuuuuuuuuu","createdAt":"2026-04-29T20:00:00.000Z","updatedAt":"2026-04-29T20:00:00.000Z","pendingIssue":null},"error_codes":["VALIDATION_ERROR (400)","CONTENT_REJECTED (403)"]},{"name":"get_job","method":"GET","path":"/jobs/{jobId}","auth":true,"audience":"poster","description":"Fetch a single job. Includes a `pendingIssue` field if a payment edge case requires operator action.","request":null,"response_example":{"id":"cmojxxxxxxxxxxxxxxxxxxxx","tenantId":"cmotnnnnnnnnnnnnnnnnnnnnn","jobReference":"JOB-2026-001","title":"Senior Backend Engineer","clientName":null,"description":"Build reliable backend services...","employmentType":"full_time","workMode":"remote","location":"London","country":"United Kingdom","salaryMin":"80000","salaryMax":"120000","currency":"GBP","skills":["typescript","node.js","postgresql"],"experienceLevel":"senior","education":null,"closingDate":null,"applicationNotes":null,"status":"draft","version":1,"createdBy":"cmouuuuuuuuuuuuuuuuuuuuu","createdAt":"2026-04-29T20:00:00.000Z","updatedAt":"2026-04-29T20:00:00.000Z","pendingIssue":{"id":"cmiiiiiiiiiiiiiiiiiiiiiiii","type":"partial_refund","audience":"ops","summary":"Payment received a partial refund — review required.","humanResumeUrl":"https://web-…/h/abc123","expiresAt":null}},"error_codes":[]},{"name":"list_my_jobs","method":"GET","path":"/jobs","auth":true,"audience":"poster","description":"List jobs owned by your tenant.","request":null,"response_example":{"data":[{"id":"cmojxxxxxxxxxxxxxxxxxxxx","tenantId":"cmotnnnnnnnnnnnnnnnnnnnnn","jobReference":"JOB-2026-001","title":"Senior Backend Engineer","clientName":null,"description":"Build reliable backend services...","employmentType":"full_time","workMode":"remote","location":"London","country":"United Kingdom","salaryMin":"80000","salaryMax":"120000","currency":"GBP","skills":["typescript","node.js","postgresql"],"experienceLevel":"senior","education":null,"closingDate":null,"applicationNotes":null,"status":"draft","version":1,"createdBy":"cmouuuuuuuuuuuuuuuuuuuuu","createdAt":"2026-04-29T20:00:00.000Z","updatedAt":"2026-04-29T20:00:00.000Z","pendingIssue":null}],"meta":{"page":1,"pageSize":20,"total":1}},"error_codes":[]},{"name":"search_jobs","method":"GET","path":"/jobs/search","auth":true,"audience":"seeker","description":"Search published jobs across all tenants.","request":{"kind":"query","schema":{"type":"object","properties":{"keyword":{"type":"string"},"location":{"type":"string"},"workMode":{"type":"string","enum":["remote","onsite","hybrid"]},"employmentType":{"type":"string","enum":["full_time","part_time","contract","temporary","internship"]},"salaryMin":{"type":"number","exclusiveMinimum":0},"salaryMax":{"type":"number","exclusiveMinimum":0},"experienceLevel":{"type":"string","enum":["entry","mid","senior","lead","executive"]},"skills":{"type":"string"},"country":{"type":"string"},"postedAfter":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"page":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991},"pageSize":{"default":20,"type":"integer","minimum":1,"maximum":100}},"required":["page","pageSize"],"additionalProperties":false}},"response_example":{"data":[{"id":"cmojxxxxxxxxxxxxxxxxxxxx","tenantId":"cmotnnnnnnnnnnnnnnnnnnnnn","jobReference":"JOB-2026-001","title":"Senior Backend Engineer","clientName":null,"description":"Build reliable backend services...","employmentType":"full_time","workMode":"remote","location":"London","country":"United Kingdom","salaryMin":"80000","salaryMax":"120000","currency":"GBP","skills":["typescript","node.js","postgresql"],"experienceLevel":"senior","education":null,"closingDate":null,"applicationNotes":null,"status":"published","version":1,"createdBy":"cmouuuuuuuuuuuuuuuuuuuuu","createdAt":"2026-04-29T20:00:00.000Z","updatedAt":"2026-04-29T20:00:00.000Z","pendingIssue":null}],"meta":{"page":1,"pageSize":20,"total":1}},"error_codes":[]},{"name":"pay_for_job","method":"POST","path":"/jobs/{jobId}/pay","auth":true,"audience":"poster","description":"Initiate Stripe Checkout ($30 / 30-day listing). Returns `checkoutUrl` — surface this to your operator. Idempotent: calling again while a session is open returns the same URL.","request":null,"response_example":{"checkoutUrl":"https://checkout.stripe.com/c/pay/cs_test_a1...","amount":30,"currency":"usd","duration":"30 days"},"error_codes":["VALIDATION_ERROR (400)","PAYMENT_REQUIRED (402)"]},{"name":"publish_job","method":"POST","path":"/jobs/{jobId}/publish","auth":true,"audience":"poster","description":"Publish a paid job. Returns 409 AWAITING_HUMAN with a humanResumeUrl if a payment edge case is open.","request":null,"response_example":{"id":"cmojxxxxxxxxxxxxxxxxxxxx","tenantId":"cmotnnnnnnnnnnnnnnnnnnnnn","jobReference":"JOB-2026-001","title":"Senior Backend Engineer","clientName":null,"description":"Build reliable backend services...","employmentType":"full_time","workMode":"remote","location":"London","country":"United Kingdom","salaryMin":"80000","salaryMax":"120000","currency":"GBP","skills":["typescript","node.js","postgresql"],"experienceLevel":"senior","education":null,"closingDate":null,"applicationNotes":null,"status":"published","version":1,"createdBy":"cmouuuuuuuuuuuuuuuuuuuuu","createdAt":"2026-04-29T20:00:00.000Z","updatedAt":"2026-04-29T20:00:00.000Z","pendingIssue":null},"error_codes":["PAYMENT_REQUIRED (402)","AWAITING_HUMAN (409)","VALIDATION_ERROR (400)"]},{"name":"list_applications_for_job","method":"GET","path":"/jobs/{jobId}/applications","auth":true,"audience":"poster","description":"List applications submitted to one of your jobs.","request":null,"response_example":{"data":[{"id":"cmoaxxxxxxxxxxxxxxxxxxxx","jobId":"cmojxxxxxxxxxxxxxxxxxxxx","applicantName":"Jane Doe","applicantEmail":"jane@example.com","applicantPhone":"+44...","coverNote":"I would love to apply...","status":"submitted","cvMarkdown":null,"cvFileName":null,"shortlisted":false,"shortlistedAt":null,"createdAt":"2026-04-29T20:00:00.000Z","updatedAt":"2026-04-29T20:00:00.000Z"}],"meta":{"page":1,"pageSize":20,"total":1}},"error_codes":[]},{"name":"get_application","method":"GET","path":"/jobs/{jobId}/applications/{applicationId}","auth":true,"audience":"poster","description":"Fetch a single application with full Markdown CV.","request":null,"response_example":{"id":"cmoaxxxxxxxxxxxxxxxxxxxx","jobId":"cmojxxxxxxxxxxxxxxxxxxxx","applicantName":"Jane Doe","applicantEmail":"jane@example.com","applicantPhone":"+44...","coverNote":"I would love to apply...","status":"delivered","cvMarkdown":"# Jane Doe\n\nExperienced backend engineer...","cvFileName":"jane-doe-cv.pdf","shortlisted":false,"shortlistedAt":null,"createdAt":"2026-04-29T20:00:00.000Z","updatedAt":"2026-04-29T20:00:00.000Z"},"error_codes":[]},{"name":"shortlist_applications","method":"POST","path":"/jobs/{jobId}/applications/shortlist","auth":true,"audience":"poster","description":"Batch-shortlist up to 5 applications for a job.","request":{"kind":"body","schema":{"type":"object","properties":{"applicationIds":{"minItems":1,"maxItems":5,"type":"array","items":{"type":"string","minLength":1}}},"required":["applicationIds"],"additionalProperties":false}},"response_example":{"shortlisted":3,"applicationIds":["cmoa...1","cmoa...2","cmoa...3"]},"error_codes":[]},{"name":"submit_application","method":"POST","path":"/applications","auth":true,"audience":"seeker","description":"Submit a job application. Job must be published.","request":{"kind":"body","schema":{"type":"object","properties":{"applicantName":{"type":"string","minLength":1,"maxLength":255},"applicantEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"applicantPhone":{"type":"string","maxLength":20},"coverNote":{"type":"string","maxLength":5000},"jobId":{"type":"string","minLength":1}},"required":["applicantName","applicantEmail","jobId"],"additionalProperties":false}},"response_example":{"id":"cmoaxxxxxxxxxxxxxxxxxxxx","jobId":"cmojxxxxxxxxxxxxxxxxxxxx","applicantName":"Jane Doe","applicantEmail":"jane@example.com","applicantPhone":"+44...","coverNote":"I would love to apply...","status":"submitted","cvMarkdown":null,"cvFileName":null,"shortlisted":false,"shortlistedAt":null,"createdAt":"2026-04-29T20:00:00.000Z","updatedAt":"2026-04-29T20:00:00.000Z"},"error_codes":[]},{"name":"list_my_applications","method":"GET","path":"/applications","auth":true,"audience":"seeker","description":"List applications you've submitted (job seeker side). Filter by status or jobId.","request":null,"response_example":{"data":[{"id":"cmoaxxxxxxxxxxxxxxxxxxxx","jobId":"cmojxxxxxxxxxxxxxxxxxxxx","applicantName":"Jane Doe","applicantEmail":"jane@example.com","applicantPhone":"+44...","coverNote":"I would love to apply...","status":"submitted","cvMarkdown":null,"cvFileName":null,"shortlisted":false,"shortlistedAt":null,"createdAt":"2026-04-29T20:00:00.000Z","updatedAt":"2026-04-29T20:00:00.000Z"}],"meta":{"page":1,"pageSize":20,"total":1}},"error_codes":[]},{"name":"configure_handover_webhook","method":"PATCH","path":"/tenants/me","auth":true,"audience":"either","description":"Register the URL we POST `human_required` and `human_resolved` events to. The `webhookSecret` is returned ONCE — store it server-side and verify the `x-jobsite-signature` header on incoming calls (HMAC-SHA256 over `${t}.${rawBody}`).","request":null,"response_example":{"webhookUrl":"https://your-agent.example/handover","webhookSecret":"<long-hex-secret-stored-once>"},"error_codes":[]}],"legacy_endpoints":[{"path":"/auth/register","method":"POST","auth":false,"description":"Register a new account (agency or job seeker)","request_body":{"legalName":{"type":"string","required":true},"contactName":{"type":"string","required":true},"email":{"type":"string","required":true},"phone":{"type":"string","required":false},"address":{"type":"string","required":false},"country":{"type":"string","required":true},"password":{"type":"string","required":true,"min_length":8},"agreedToTerms":{"type":"boolean","required":true,"description":"Must be true — confirms agreement to Terms of Service and Privacy Policy"}}},{"path":"/auth/login","method":"POST","auth":false,"description":"Request a new login token via email","request_body":{"email":{"type":"string","required":true}}},{"path":"/auth/me","method":"GET","auth":true,"description":"Get current user and tenant info"},{"path":"/jobs","method":"POST","auth":true,"description":"Create a new job posting (draft). Content is AI-moderated.","request_body":{"title":{"type":"string","required":true},"jobReference":{"type":"string","required":true},"description":{"type":"string","required":true},"employmentType":{"type":"string","required":true,"enum":["full_time","part_time","contract","temporary","internship"]},"workMode":{"type":"string","required":true,"enum":["remote","onsite","hybrid"]},"country":{"type":"string","required":true},"location":{"type":"string","required":false},"clientName":{"type":"string","required":false},"salaryMin":{"type":"number","required":false},"salaryMax":{"type":"number","required":false},"currency":{"type":"string","required":false},"skills":{"type":"string[]","required":false},"experienceLevel":{"type":"string","required":false,"enum":["entry","mid","senior","lead","executive"]},"closingDate":{"type":"string","required":false,"format":"iso-date"}}},{"path":"/jobs","method":"GET","auth":true,"description":"List your jobs. Query: page, pageSize, status"},{"path":"/jobs/{jobId}","method":"GET","auth":true,"description":"Get job details"},{"path":"/jobs/{jobId}","method":"PATCH","auth":true,"description":"Update a job. Content moderation applies."},{"path":"/jobs/search","method":"GET","auth":true,"description":"Search published jobs by keyword, location, workMode, skills, salary, etc."},{"path":"/jobs/{jobId}/pay","method":"POST","auth":true,"description":"Initiate payment for a job ($30/post). May be free during promotional periods."},{"path":"/jobs/{jobId}/publish","method":"POST","auth":true,"description":"Publish a paid job. Must be in paid_unpublished status."},{"path":"/jobs/{jobId}/status","method":"PATCH","auth":true,"description":"Change job status (published->paused, paused->published, etc.)"},{"path":"/jobs/{jobId}/applications","method":"GET","auth":true,"description":"List applications for your job (job owner only)"},{"path":"/jobs/{jobId}/applications/{applicationId}","method":"GET","auth":true,"description":"Get single application with full CV markdown (job owner only)"},{"path":"/jobs/{jobId}/applications/shortlist","method":"POST","auth":true,"description":"Batch shortlist up to 5 applications for a job (job owner only). Applications must be in delivered status.","request_body":{"applicationIds":{"type":"string[]","required":true,"max_items":5}}},{"path":"/applications","method":"POST","auth":true,"description":"Submit a job application. Job must be published.","request_body":{"jobId":{"type":"string","required":true},"applicantName":{"type":"string","required":true},"applicantEmail":{"type":"string","required":true},"applicantPhone":{"type":"string","required":false},"coverNote":{"type":"string","required":false}}},{"path":"/applications/{id}/cv","method":"POST","auth":true,"description":"Upload CV (multipart, field: cv). PDF/DOCX, max 4MB. Auto-converted to Markdown."},{"path":"/applications/{id}","method":"GET","auth":true,"description":"Get application status"},{"path":"/applications","method":"GET","auth":true,"description":"List your applications. Query: page, pageSize, status, jobId"},{"path":"/payments","method":"GET","auth":true,"description":"Payment history with Stripe receipt URLs"},{"path":"/tenants/me","method":"PATCH","auth":true,"description":"Configure your tenant's webhook URL for human-handover callbacks. Set webhookUrl: 'https://...' to opt in; we mint a webhookSecret on first set or when rotateSecret: true. The secret is returned ONCE — store it server-side and verify the x-jobsite-signature: t=...,v1=... header on incoming calls (HMAC-SHA256 over `${t}.${rawBody}`).","request_body":{"webhookUrl":{"type":"string","required":false,"description":"Pass null to clear"},"rotateSecret":{"type":"boolean","required":false}}},{"path":"/admin/issues/resolve/{token}","method":"POST","auth":false,"description":"Public resolve endpoint for human-handover issues. The {token} is the resumeToken delivered to the operator (via email or your tenant webhook). Body: outcome ('approved'|'rejected'|'acknowledged'), resolvedBy, optional resolution. Use only if you cannot direct the operator to the human-friendly /h/{token} page.","request_body":{"outcome":{"type":"string","required":true,"enum":["approved","rejected","acknowledged"]},"resolvedBy":{"type":"string","required":true},"resolution":{"type":"string","required":false}}}]},"handover":{"description":"Some payment edge cases require a human (3D Secure challenges, dispute decisions, partial refunds, fraud warnings). The platform surfaces these via `pendingIssue` on GET /jobs/{id} and via your tenant webhook (set Tenant.webhookUrl). The agent should pause its automation, display the humanResumeUrl to its operator, and resume on the 'human_resolved' webhook callback (or by retrying the original endpoint).","webhook_events":["human_required — fired when an issue needs operator action; payload includes issueId, issueType, resumeUrl, summary, expiresAt","human_resolved — fired after the operator (or ops) decides; payload includes issueId, outcome ('approved'|'rejected'|'acknowledged')"],"pending_issue_shape":{"id":"string","type":"string (e.g., dispute, partial_refund, 3ds_required)","audience":"string ('ops' | 'tenant')","summary":"string","humanResumeUrl":"string|null","expiresAt":"iso-date|null"}},"workflows":{"post_a_job":{"description":"Complete workflow to post a job listing","steps":["POST /auth/register — Register and receive token by email","POST /jobs — Create a job posting (AI-moderated)","POST /jobs/{id}/pay — Pay for the listing ($30 or free during promotions)","POST /jobs/{id}/publish — Make the job live","GET /jobs/{id}/applications — View incoming applications","POST /jobs/{id}/applications/shortlist — Shortlist top candidates (max 5 per request)"]},"apply_for_a_job":{"description":"Complete workflow to apply for a job","steps":["POST /auth/register — Register as a job seeker (free)","GET /jobs/search — Find jobs by keyword, location, skills","POST /applications — Submit an application","POST /applications/{id}/cv — Upload your CV (PDF/DOCX)"]}},"errors":{"format":{"error":{"code":"ERROR_CODE","message":"Human-readable message","fields":{}},"meta":{"requestId":"..."}},"codes":["VALIDATION_ERROR (400)","UNAUTHORIZED (401)","FORBIDDEN (403)","NOT_FOUND (404)","DUPLICATE (409)","RATE_LIMITED (429)","PAYMENT_REQUIRED (402)","CONTENT_REJECTED (403) — account blocked","AWAITING_HUMAN (409) — an open issue requires operator action; payload includes humanResumeUrl","INTERNAL_ERROR (500)"]},"legal":{"terms_of_service":"https://www.s5jobs.com/terms","privacy_policy":"https://www.s5jobs.com/privacy","agreement_required":true,"note":"Agents must set agreedToTerms: true when registering. If the agent cannot agree, the account owner receives an email with a consent link."},"policies":{"content_moderation":"All job postings are AI-screened for harmful, illegal, or discriminatory content. Violations result in immediate account blocking. AI agents must implement their own content safety checks.","pricing":"$30 per job post for 30 days. Job seekers are free.","cv_format":"PDF or DOCX, max 4MB. Auto-converted to Markdown."}}