{"openapi":"3.1.0","info":{"title":"Naseej Integration Hub API","version":"1.0.0","description":"Move workforce data in and out of Naseej. Every write is idempotent, every read is incremental, and every record keeps your own external IDs.\n\nAuthenticate with `Authorization: Bearer <api key>`. Keys are scoped per entity; a key that can read candidates cannot write jobs.","contact":{"name":"Naseej Integration Hub","url":"https://naseejconsulting.com/developer"}},"servers":[{"url":"https://naseejconsulting.com/api/v1","description":"Production"},{"url":"https://sandbox.naseejconsulting.com/api/v1","description":"Sandbox"}],"tags":[{"name":"schemas","description":"Discover the canonical model at runtime."},{"name":"imports","description":"Asynchronous bulk imports."},{"name":"companies","description":"A client organization that hires through Naseej."},{"name":"agencies","description":"A supplying staffing agency or partner firm."},{"name":"users","description":"A person with access to the Naseej workspace."},{"name":"workers","description":"A person currently engaged through Naseej."},{"name":"candidates","description":"A person being considered for work."},{"name":"contacts","description":"A person at a client company or agency."},{"name":"jobs","description":"An open role a company wants filled."},{"name":"applications","description":"A candidate's application to a job."},{"name":"submissions","description":"An agency's presentation of a candidate to a job."},{"name":"interviews","description":"A scheduled conversation with a candidate."},{"name":"offers","description":"A formal offer extended to a candidate."},{"name":"placements","description":"A confirmed engagement resulting from a hire."},{"name":"assignments","description":"A unit of work a placed worker is assigned to."},{"name":"timesheets","description":"Hours a worker recorded for a period."},{"name":"skills","description":"A capability a candidate or worker holds."},{"name":"certifications","description":"A credential a person holds."},{"name":"resumes","description":"A CV attached to a candidate."},{"name":"documents","description":"A contract, right-to-work record or other stored file."},{"name":"talent-pools","description":"A curated grouping of candidates."}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Scoped API key. Available scopes: agencies:read, agencies:write, applications:read, applications:write, assignments:read, assignments:write, audit:read, candidates:read, candidates:write, certifications:read, certifications:write, companies:read, companies:write, connections:read, connections:write, contacts:read, contacts:write, documents:read, documents:write, imports:read, imports:write, interviews:read, interviews:write, jobs:read, jobs:write, offers:read, offers:write, placements:read, placements:write, resumes:read, resumes:write, schemas:read, skills:read, skills:write, submissions:read, submissions:write, talent_pools:read, talent_pools:write, timesheets:read, timesheets:write, users:read, users:write, webhooks:read, webhooks:write, workers:read, workers:write."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["type","code","message"],"properties":{"type":{"type":"string","example":"invalid_request_error"},"code":{"type":"string","example":"unknown_field"},"message":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}}}},"requestId":{"type":"string","description":"Correlates with the entry in the developer portal's API log."}}}}},"Company":{"type":"object","description":"A client organization that hires through Naseej.","required":["name"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Company.","readOnly":true},"object":{"type":"string","const":"company","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"name":{"description":"Legal or trading name of the company.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"registrationNumber":{"description":"Company registration or tax identifier in its home jurisdiction.","type":"string","maxLength":500,"x-sensitivity":"contractual"},"country":{"description":"Primary country of operation.","type":"string","minLength":2,"maxLength":2,"pattern":"^[A-Z]{2}$","x-sensitivity":"ordinary"},"industry":{"description":"Industry or sector classification.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"website":{"description":"Public website.","type":"string","format":"uri","x-sensitivity":"ordinary"},"status":{"description":"Whether the company is an active client.","type":"string","enum":["active","prospect","inactive","archived"],"x-sensitivity":"contractual"}},"additionalProperties":false},"Agency":{"type":"object","description":"A supplying staffing agency or partner firm.","required":["name"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Agency.","readOnly":true},"object":{"type":"string","const":"agency","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"name":{"description":"Name of the supplying agency.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"country":{"description":"Country the agency operates from.","type":"string","minLength":2,"maxLength":2,"pattern":"^[A-Z]{2}$","x-sensitivity":"ordinary"},"contactEmail":{"description":"Contact email used for contact and duplicate detection.","type":"string","format":"email","x-sensitivity":"identity"},"status":{"description":"Whether the agency may currently submit talent.","type":"string","enum":["active","pending","suspended","terminated"],"x-sensitivity":"contractual"}},"additionalProperties":false},"User":{"type":"object","description":"A person with access to the Naseej workspace.","required":["userName","email"],"properties":{"id":{"type":"string","description":"Naseej identifier for this User.","readOnly":true},"object":{"type":"string","const":"user","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"userName":{"description":"Login identifier, matching the SCIM userName attribute.","type":"string","maxLength":500,"x-sensitivity":"identity"},"email":{"description":"Email used for contact and duplicate detection.","type":"string","format":"email","x-sensitivity":"identity"},"firstName":{"description":"Given name.","type":"string","maxLength":500,"x-sensitivity":"identity"},"lastName":{"description":"Family name.","type":"string","maxLength":500,"x-sensitivity":"identity"},"role":{"description":"Workspace role granted to the user.","type":"string","maxLength":500,"x-sensitivity":"contractual"},"active":{"description":"Whether the account may sign in.","type":"boolean","x-sensitivity":"contractual"}},"additionalProperties":false},"Worker":{"type":"object","description":"A person currently engaged through Naseej.","required":["workerId","firstName","lastName"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Worker.","readOnly":true},"object":{"type":"string","const":"worker","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"workerId":{"description":"The customer's own workforce identifier for this person.","type":"string","maxLength":500,"x-sensitivity":"employment"},"firstName":{"description":"Given name.","type":"string","maxLength":500,"x-sensitivity":"identity"},"lastName":{"description":"Family name.","type":"string","maxLength":500,"x-sensitivity":"identity"},"email":{"description":"Work email used for contact and duplicate detection.","type":"string","format":"email","x-sensitivity":"identity"},"companyExternalId":{"description":"External ID of the company the worker is engaged with.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"engagementType":{"description":"Employment or contracting arrangement.","type":"string","maxLength":500,"x-sensitivity":"employment"},"startDate":{"description":"First day of the engagement.","type":"string","format":"date","x-sensitivity":"employment"},"endDate":{"description":"Last day of the engagement, if known.","type":"string","format":"date","x-sensitivity":"employment"},"payRate":{"description":"Agreed pay rate for the engagement.","type":"number","x-sensitivity":"financial"},"payRateCurrency":{"description":"Currency of the pay rate.","type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$","x-sensitivity":"financial"},"verified":{"description":"Whether identity and right-to-work checks have completed.","type":"boolean","x-sensitivity":"employment"}},"additionalProperties":false},"Candidate":{"type":"object","description":"A person being considered for work.","required":["firstName","lastName"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Candidate.","readOnly":true},"object":{"type":"string","const":"candidate","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"firstName":{"description":"Given name.","type":"string","maxLength":500,"x-sensitivity":"identity"},"lastName":{"description":"Family name.","type":"string","maxLength":500,"x-sensitivity":"identity"},"email":{"description":"Email used for contact and duplicate detection.","type":"string","format":"email","x-sensitivity":"identity"},"phone":{"description":"Primary telephone number.","type":"string","maxLength":500,"x-sensitivity":"identity"},"country":{"description":"Country of residence.","type":"string","minLength":2,"maxLength":2,"pattern":"^[A-Z]{2}$","x-sensitivity":"identity"},"city":{"description":"City of residence.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"currentEmployer":{"description":"Where the candidate works today.","type":"string","maxLength":500,"x-sensitivity":"employment"},"currentTitle":{"description":"The candidate's present job title.","type":"string","maxLength":500,"x-sensitivity":"employment"},"yearsExperience":{"description":"Total relevant professional experience in years.","type":"number","x-sensitivity":"employment"},"desiredRate":{"description":"Rate or salary the candidate is seeking.","type":"number","x-sensitivity":"financial"},"desiredRateCurrency":{"description":"Currency of the desired rate.","type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$","x-sensitivity":"financial"},"availabilityDate":{"description":"Earliest date the candidate can start.","type":"string","format":"date","x-sensitivity":"employment"},"workAuthorization":{"description":"Right-to-work status as supplied by the source system.","type":"string","maxLength":500,"x-sensitivity":"employment"},"source":{"description":"How the candidate entered the pipeline.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"status":{"description":"Pipeline standing of the candidate record.","type":"string","enum":["new","active","placed","do_not_contact","archived"],"x-sensitivity":"employment"}},"additionalProperties":false},"Contact":{"type":"object","description":"A person at a client company or agency.","required":["firstName","lastName","email"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Contact.","readOnly":true},"object":{"type":"string","const":"contact","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"firstName":{"description":"Given name.","type":"string","maxLength":500,"x-sensitivity":"identity"},"lastName":{"description":"Family name.","type":"string","maxLength":500,"x-sensitivity":"identity"},"email":{"description":"Email used for contact and duplicate detection.","type":"string","format":"email","x-sensitivity":"identity"},"phone":{"description":"Contact telephone number in E.164 where possible.","type":"string","maxLength":500,"x-sensitivity":"identity"},"title":{"description":"The contact's role at their organization.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"companyExternalId":{"description":"External ID of the company this contact belongs to.","type":"string","maxLength":500,"x-sensitivity":"ordinary"}},"additionalProperties":false},"Job":{"type":"object","description":"An open role a company wants filled.","required":["title"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Job.","readOnly":true},"object":{"type":"string","const":"job","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"title":{"description":"Title of the open role.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"requisitionNumber":{"description":"The customer's requisition identifier.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"companyExternalId":{"description":"External ID of the hiring company.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"description":{"description":"Role description as published.","type":"string","x-sensitivity":"ordinary"},"country":{"description":"Country the role is based in.","type":"string","minLength":2,"maxLength":2,"pattern":"^[A-Z]{2}$","x-sensitivity":"ordinary"},"city":{"description":"City the role is based in.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"employmentType":{"description":"Permanent, contract, temporary and so on.","type":"string","maxLength":500,"x-sensitivity":"employment"},"openDate":{"description":"Date the requisition opened.","type":"string","format":"date","x-sensitivity":"ordinary"},"closeDate":{"description":"Date the requisition closed or expires.","type":"string","format":"date","x-sensitivity":"ordinary"},"openings":{"description":"How many people the requisition covers.","type":"integer","x-sensitivity":"ordinary"},"salaryMin":{"description":"Bottom of the published pay range.","type":"number","x-sensitivity":"financial"},"salaryMax":{"description":"Top of the published pay range.","type":"number","x-sensitivity":"financial"},"salaryCurrency":{"description":"Currency of the published pay range.","type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$","x-sensitivity":"financial"},"status":{"description":"Whether the requisition is accepting submissions.","type":"string","enum":["draft","open","on_hold","filled","closed","cancelled"],"x-sensitivity":"contractual"}},"additionalProperties":false},"Application":{"type":"object","description":"A candidate's application to a job.","required":["candidateExternalId","jobExternalId"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Application.","readOnly":true},"object":{"type":"string","const":"application","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"candidateExternalId":{"description":"External ID of the applying candidate.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"jobExternalId":{"description":"External ID of the job applied to.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"appliedAt":{"description":"When the application was received.","type":"string","format":"date-time","x-sensitivity":"ordinary"},"stage":{"description":"Pipeline stage as named by the source system.","type":"string","maxLength":500,"x-sensitivity":"employment"},"status":{"description":"Outcome state of the application.","type":"string","enum":["submitted","screening","interviewing","offered","hired","rejected","withdrawn"],"x-sensitivity":"employment"},"rejectionReason":{"description":"Why the application did not proceed.","type":"string","maxLength":500,"x-sensitivity":"employment"}},"additionalProperties":false},"Submission":{"type":"object","description":"An agency's presentation of a candidate to a job.","required":["candidateExternalId","jobExternalId"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Submission.","readOnly":true},"object":{"type":"string","const":"submission","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"candidateExternalId":{"description":"External ID of the submitted candidate.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"jobExternalId":{"description":"External ID of the job submitted to.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"agencyExternalId":{"description":"External ID of the submitting agency.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"submittedAt":{"description":"When the submission was made.","type":"string","format":"date-time","x-sensitivity":"ordinary"},"billRate":{"description":"Rate quoted to the client for this submission.","type":"number","x-sensitivity":"financial"},"payRate":{"description":"Rate payable to the worker for this submission.","type":"number","x-sensitivity":"financial"},"currency":{"description":"Currency of the submission's bill and pay rates.","type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$","x-sensitivity":"financial"},"status":{"description":"Where the submission stands.","type":"string","enum":["submitted","shortlisted","interviewing","offered","placed","rejected","withdrawn"],"x-sensitivity":"employment"}},"additionalProperties":false},"Interview":{"type":"object","description":"A scheduled conversation with a candidate.","required":["candidateExternalId","scheduledAt"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Interview.","readOnly":true},"object":{"type":"string","const":"interview","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"candidateExternalId":{"description":"External ID of the interviewed candidate.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"jobExternalId":{"description":"External ID of the job being interviewed for.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"scheduledAt":{"description":"Interview start time.","type":"string","format":"date-time","x-sensitivity":"ordinary"},"durationMinutes":{"description":"Planned length of the interview.","type":"integer","x-sensitivity":"ordinary"},"mode":{"description":"How the interview is conducted.","type":"string","enum":["video","phone","onsite","assessment"],"x-sensitivity":"ordinary"},"status":{"description":"Interview lifecycle state.","type":"string","enum":["scheduled","completed","cancelled","no_show","rescheduled"],"x-sensitivity":"ordinary"}},"additionalProperties":false},"Offer":{"type":"object","description":"A formal offer extended to a candidate.","required":["candidateExternalId","jobExternalId"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Offer.","readOnly":true},"object":{"type":"string","const":"offer","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"candidateExternalId":{"description":"External ID of the candidate receiving the offer.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"jobExternalId":{"description":"External ID of the job offered.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"offeredAt":{"description":"When the offer was extended.","type":"string","format":"date-time","x-sensitivity":"contractual"},"startDate":{"description":"Proposed first day.","type":"string","format":"date","x-sensitivity":"employment"},"compensation":{"description":"Offered pay.","type":"number","x-sensitivity":"financial"},"compensationCurrency":{"description":"Currency of the offered pay.","type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$","x-sensitivity":"financial"},"status":{"description":"Where the offer stands.","type":"string","enum":["draft","extended","accepted","declined","rescinded","expired"],"x-sensitivity":"contractual"}},"additionalProperties":false},"Placement":{"type":"object","description":"A confirmed engagement resulting from a hire.","required":["candidateExternalId","startDate"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Placement.","readOnly":true},"object":{"type":"string","const":"placement","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"candidateExternalId":{"description":"External ID of the placed candidate.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"jobExternalId":{"description":"External ID of the job filled.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"companyExternalId":{"description":"External ID of the hiring company.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"startDate":{"description":"First day of the placement.","type":"string","format":"date","x-sensitivity":"employment"},"endDate":{"description":"Last day of the placement, if fixed term.","type":"string","format":"date","x-sensitivity":"employment"},"billRate":{"description":"Rate charged to the client.","type":"number","x-sensitivity":"financial"},"payRate":{"description":"Rate paid to the worker.","type":"number","x-sensitivity":"financial"},"currency":{"description":"Currency of the placement rates.","type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$","x-sensitivity":"financial"},"status":{"description":"Placement lifecycle state.","type":"string","enum":["pending","active","completed","terminated","cancelled"],"x-sensitivity":"contractual"}},"additionalProperties":false},"Assignment":{"type":"object","description":"A unit of work a placed worker is assigned to.","required":["workerExternalId","name"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Assignment.","readOnly":true},"object":{"type":"string","const":"assignment","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"workerExternalId":{"description":"External ID of the assigned worker.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"name":{"description":"What the assignment is called.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"startDate":{"description":"Assignment start.","type":"string","format":"date","x-sensitivity":"employment"},"endDate":{"description":"Assignment end.","type":"string","format":"date","x-sensitivity":"employment"},"status":{"description":"Assignment lifecycle state.","type":"string","enum":["planned","active","completed","cancelled"],"x-sensitivity":"ordinary"}},"additionalProperties":false},"Timesheet":{"type":"object","description":"Hours a worker recorded for a period.","required":["workerExternalId","periodStart","periodEnd","hours"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Timesheet.","readOnly":true},"object":{"type":"string","const":"timesheet","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"workerExternalId":{"description":"External ID of the worker the hours belong to.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"periodStart":{"description":"First day of the timesheet period.","type":"string","format":"date","x-sensitivity":"employment"},"periodEnd":{"description":"Last day of the timesheet period.","type":"string","format":"date","x-sensitivity":"employment"},"hours":{"description":"Regular hours recorded.","type":"number","x-sensitivity":"financial"},"overtimeHours":{"description":"Overtime hours recorded.","type":"number","x-sensitivity":"financial"},"status":{"description":"Approval state of the timesheet.","type":"string","enum":["draft","submitted","approved","rejected","paid"],"x-sensitivity":"financial"}},"additionalProperties":false},"Skill":{"type":"object","description":"A capability a candidate or worker holds.","required":["personExternalId","name"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Skill.","readOnly":true},"object":{"type":"string","const":"skill","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"personExternalId":{"description":"External ID of the candidate or worker holding the skill.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"name":{"description":"Name of the skill.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"level":{"description":"Proficiency as recorded by the source system.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"yearsExperience":{"description":"Years of experience with this skill.","type":"number","x-sensitivity":"employment"}},"additionalProperties":false},"Certification":{"type":"object","description":"A credential a person holds.","required":["personExternalId","name"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Certification.","readOnly":true},"object":{"type":"string","const":"certification","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"personExternalId":{"description":"External ID of the person holding the credential.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"name":{"description":"Name of the credential.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"issuer":{"description":"Body that issued the credential.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"issuedDate":{"description":"When the credential was awarded.","type":"string","format":"date","x-sensitivity":"ordinary"},"expiryDate":{"description":"When the credential lapses.","type":"string","format":"date","x-sensitivity":"employment"}},"additionalProperties":false},"Resume":{"type":"object","description":"A CV attached to a candidate.","required":["candidateExternalId"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Resume.","readOnly":true},"object":{"type":"string","const":"resume","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"candidateExternalId":{"description":"External ID of the candidate the CV belongs to.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"fileName":{"description":"Original file name.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"contentType":{"description":"MIME type of the stored file.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"uploadedAt":{"description":"When the CV was added.","type":"string","format":"date-time","x-sensitivity":"ordinary"}},"additionalProperties":false},"Document":{"type":"object","description":"A contract, right-to-work record or other stored file.","required":["subjectExternalId","documentType"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Document.","readOnly":true},"object":{"type":"string","const":"document","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"subjectExternalId":{"description":"External ID of the record the document belongs to.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"documentType":{"description":"What kind of document this is.","type":"string","maxLength":500,"x-sensitivity":"contractual"},"fileName":{"description":"Original file name.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"issuedDate":{"description":"When the document was issued or signed.","type":"string","format":"date","x-sensitivity":"contractual"},"expiryDate":{"description":"When the document stops being valid.","type":"string","format":"date","x-sensitivity":"contractual"}},"additionalProperties":false},"TalentPool":{"type":"object","description":"A curated grouping of candidates.","required":["name"],"properties":{"id":{"type":"string","description":"Naseej identifier for this Talent pool.","readOnly":true},"object":{"type":"string","const":"talentPool","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"externalId":{"description":"The record's primary key in the customer's own system. Preserved verbatim.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"externalSystem":{"description":"Which system the external ID belongs to, e.g. workday, bullhorn, sap.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"name":{"description":"What the pool is called.","type":"string","maxLength":500,"x-sensitivity":"ordinary"},"description":{"description":"What the pool is for.","type":"string","x-sensitivity":"ordinary"}},"additionalProperties":false},"ImportJob":{"type":"object","properties":{"job_id":{"type":"string"},"reference":{"type":"string","example":"IMP-92872"},"entity":{"type":"string"},"status":{"type":"string","enum":["queued","analyzing","awaiting_approval","importing","completed","failed","rolled_back"]},"dry_run":{"type":"boolean"},"records_received":{"type":"integer"},"records_processed":{"type":"integer"},"records_created":{"type":"integer"},"records_updated":{"type":"integer"},"records_skipped":{"type":"integer"},"records_failed":{"type":"integer"},"quality":{"$ref":"#/components/schemas/QualityReport"},"duplicates_for_review":{"type":"integer"}}},"QualityReport":{"type":"object","description":"The Import Quality Report: what is valid, what carries warnings, what was rejected and why.","properties":{"entity":{"type":"string"},"totalRecords":{"type":"integer"},"validRecords":{"type":"integer"},"recordsWithWarnings":{"type":"integer"},"rejectedRecords":{"type":"integer"},"autoFixableCount":{"type":"integer"},"issuesByCode":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"severity":{"type":"string","enum":["error","warning"]},"count":{"type":"integer"},"message":{"type":"string"}}}}}}}},"paths":{"/companies":{"get":{"operationId":"listCompanys","tags":["companies"],"summary":"List Company records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["companies:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Company records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Company"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createCompany","tags":["companies"],"summary":"Create a Company","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["companies:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/companies/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getCompany","tags":["companies"],"summary":"Retrieve a Company","security":[{"apiKey":["companies:read"]}],"responses":{"200":{"description":"Company","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateCompany","tags":["companies"],"summary":"Update a Company","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["companies:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceCompany","tags":["companies"],"summary":"Create or replace a Company","security":[{"apiKey":["companies:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteCompany","tags":["companies"],"summary":"Delete a Company","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["companies:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/companies/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getCompanyLineage","tags":["companies"],"summary":"Where each value of a Company came from","security":[{"apiKey":["audit:read","companies:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/companies":{"post":{"operationId":"bulkCompany","tags":["imports"],"summary":"Bulk create or update Company records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","companies:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Company"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Company"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/agencies":{"get":{"operationId":"listAgencys","tags":["agencies"],"summary":"List Agency records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["agencies:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Agency records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Agency"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createAgency","tags":["agencies"],"summary":"Create a Agency","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["agencies:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agency"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agency"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agency"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/agencies/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getAgency","tags":["agencies"],"summary":"Retrieve a Agency","security":[{"apiKey":["agencies:read"]}],"responses":{"200":{"description":"Agency","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agency"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateAgency","tags":["agencies"],"summary":"Update a Agency","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["agencies:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agency"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agency"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceAgency","tags":["agencies"],"summary":"Create or replace a Agency","security":[{"apiKey":["agencies:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agency"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agency"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agency"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteAgency","tags":["agencies"],"summary":"Delete a Agency","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["agencies:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/agencies/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getAgencyLineage","tags":["agencies"],"summary":"Where each value of a Agency came from","security":[{"apiKey":["audit:read","agencies:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/agencies":{"post":{"operationId":"bulkAgency","tags":["imports"],"summary":"Bulk create or update Agency records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","agencies:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Agency"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Agency"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/users":{"get":{"operationId":"listUsers","tags":["users"],"summary":"List User records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["users:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of User records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/User"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createUser","tags":["users"],"summary":"Create a User","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["users:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/users/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getUser","tags":["users"],"summary":"Retrieve a User","security":[{"apiKey":["users:read"]}],"responses":{"200":{"description":"User","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateUser","tags":["users"],"summary":"Update a User","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["users:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceUser","tags":["users"],"summary":"Create or replace a User","security":[{"apiKey":["users:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteUser","tags":["users"],"summary":"Delete a User","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["users:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/users/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getUserLineage","tags":["users"],"summary":"Where each value of a User came from","security":[{"apiKey":["audit:read","users:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/users":{"post":{"operationId":"bulkUser","tags":["imports"],"summary":"Bulk create or update User records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","users:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/User"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/User"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/workers":{"get":{"operationId":"listWorkers","tags":["workers"],"summary":"List Worker records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["workers:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Worker records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Worker"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createWorker","tags":["workers"],"summary":"Create a Worker","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["workers:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Worker"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Worker"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Worker"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/workers/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getWorker","tags":["workers"],"summary":"Retrieve a Worker","security":[{"apiKey":["workers:read"]}],"responses":{"200":{"description":"Worker","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Worker"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateWorker","tags":["workers"],"summary":"Update a Worker","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["workers:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Worker"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Worker"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceWorker","tags":["workers"],"summary":"Create or replace a Worker","security":[{"apiKey":["workers:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Worker"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Worker"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Worker"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteWorker","tags":["workers"],"summary":"Delete a Worker","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["workers:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/workers/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getWorkerLineage","tags":["workers"],"summary":"Where each value of a Worker came from","security":[{"apiKey":["audit:read","workers:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/workers":{"post":{"operationId":"bulkWorker","tags":["imports"],"summary":"Bulk create or update Worker records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","workers:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Worker"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Worker"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/candidates":{"get":{"operationId":"listCandidates","tags":["candidates"],"summary":"List Candidate records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["candidates:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Candidate records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Candidate"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createCandidate","tags":["candidates"],"summary":"Create a Candidate","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["candidates:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Candidate"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Candidate"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Candidate"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/candidates/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getCandidate","tags":["candidates"],"summary":"Retrieve a Candidate","security":[{"apiKey":["candidates:read"]}],"responses":{"200":{"description":"Candidate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Candidate"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateCandidate","tags":["candidates"],"summary":"Update a Candidate","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["candidates:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Candidate"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Candidate"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceCandidate","tags":["candidates"],"summary":"Create or replace a Candidate","security":[{"apiKey":["candidates:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Candidate"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Candidate"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Candidate"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteCandidate","tags":["candidates"],"summary":"Delete a Candidate","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["candidates:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/candidates/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getCandidateLineage","tags":["candidates"],"summary":"Where each value of a Candidate came from","security":[{"apiKey":["audit:read","candidates:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/candidates":{"post":{"operationId":"bulkCandidate","tags":["imports"],"summary":"Bulk create or update Candidate records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","candidates:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Candidate"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Candidate"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contacts":{"get":{"operationId":"listContacts","tags":["contacts"],"summary":"List Contact records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["contacts:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Contact records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Contact"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createContact","tags":["contacts"],"summary":"Create a Contact","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["contacts:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contacts/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getContact","tags":["contacts"],"summary":"Retrieve a Contact","security":[{"apiKey":["contacts:read"]}],"responses":{"200":{"description":"Contact","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateContact","tags":["contacts"],"summary":"Update a Contact","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["contacts:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceContact","tags":["contacts"],"summary":"Create or replace a Contact","security":[{"apiKey":["contacts:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteContact","tags":["contacts"],"summary":"Delete a Contact","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["contacts:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/contacts/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getContactLineage","tags":["contacts"],"summary":"Where each value of a Contact came from","security":[{"apiKey":["audit:read","contacts:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/contacts":{"post":{"operationId":"bulkContact","tags":["imports"],"summary":"Bulk create or update Contact records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","contacts:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Contact"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Contact"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/jobs":{"get":{"operationId":"listJobs","tags":["jobs"],"summary":"List Job records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["jobs:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Job records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Job"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createJob","tags":["jobs"],"summary":"Create a Job","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["jobs:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/jobs/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getJob","tags":["jobs"],"summary":"Retrieve a Job","security":[{"apiKey":["jobs:read"]}],"responses":{"200":{"description":"Job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateJob","tags":["jobs"],"summary":"Update a Job","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["jobs:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceJob","tags":["jobs"],"summary":"Create or replace a Job","security":[{"apiKey":["jobs:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteJob","tags":["jobs"],"summary":"Delete a Job","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["jobs:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/jobs/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getJobLineage","tags":["jobs"],"summary":"Where each value of a Job came from","security":[{"apiKey":["audit:read","jobs:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/jobs":{"post":{"operationId":"bulkJob","tags":["imports"],"summary":"Bulk create or update Job records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","jobs:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Job"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Job"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/applications":{"get":{"operationId":"listApplications","tags":["applications"],"summary":"List Application records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["applications:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Application records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Application"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createApplication","tags":["applications"],"summary":"Create a Application","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["applications:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/applications/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getApplication","tags":["applications"],"summary":"Retrieve a Application","security":[{"apiKey":["applications:read"]}],"responses":{"200":{"description":"Application","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateApplication","tags":["applications"],"summary":"Update a Application","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["applications:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceApplication","tags":["applications"],"summary":"Create or replace a Application","security":[{"apiKey":["applications:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Application"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteApplication","tags":["applications"],"summary":"Delete a Application","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["applications:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/applications/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getApplicationLineage","tags":["applications"],"summary":"Where each value of a Application came from","security":[{"apiKey":["audit:read","applications:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/applications":{"post":{"operationId":"bulkApplication","tags":["imports"],"summary":"Bulk create or update Application records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","applications:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Application"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Application"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/submissions":{"get":{"operationId":"listSubmissions","tags":["submissions"],"summary":"List Submission records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["submissions:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Submission records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Submission"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createSubmission","tags":["submissions"],"summary":"Create a Submission","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["submissions:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Submission"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Submission"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Submission"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/submissions/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getSubmission","tags":["submissions"],"summary":"Retrieve a Submission","security":[{"apiKey":["submissions:read"]}],"responses":{"200":{"description":"Submission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Submission"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateSubmission","tags":["submissions"],"summary":"Update a Submission","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["submissions:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Submission"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Submission"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceSubmission","tags":["submissions"],"summary":"Create or replace a Submission","security":[{"apiKey":["submissions:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Submission"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Submission"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Submission"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteSubmission","tags":["submissions"],"summary":"Delete a Submission","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["submissions:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/submissions/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getSubmissionLineage","tags":["submissions"],"summary":"Where each value of a Submission came from","security":[{"apiKey":["audit:read","submissions:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/submissions":{"post":{"operationId":"bulkSubmission","tags":["imports"],"summary":"Bulk create or update Submission records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","submissions:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Submission"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Submission"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/interviews":{"get":{"operationId":"listInterviews","tags":["interviews"],"summary":"List Interview records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["interviews:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Interview records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Interview"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createInterview","tags":["interviews"],"summary":"Create a Interview","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["interviews:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Interview"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Interview"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Interview"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/interviews/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getInterview","tags":["interviews"],"summary":"Retrieve a Interview","security":[{"apiKey":["interviews:read"]}],"responses":{"200":{"description":"Interview","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Interview"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateInterview","tags":["interviews"],"summary":"Update a Interview","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["interviews:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Interview"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Interview"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceInterview","tags":["interviews"],"summary":"Create or replace a Interview","security":[{"apiKey":["interviews:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Interview"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Interview"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Interview"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteInterview","tags":["interviews"],"summary":"Delete a Interview","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["interviews:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/interviews/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getInterviewLineage","tags":["interviews"],"summary":"Where each value of a Interview came from","security":[{"apiKey":["audit:read","interviews:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/interviews":{"post":{"operationId":"bulkInterview","tags":["imports"],"summary":"Bulk create or update Interview records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","interviews:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Interview"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Interview"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/offers":{"get":{"operationId":"listOffers","tags":["offers"],"summary":"List Offer records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["offers:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Offer records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Offer"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createOffer","tags":["offers"],"summary":"Create a Offer","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["offers:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Offer"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Offer"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Offer"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/offers/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getOffer","tags":["offers"],"summary":"Retrieve a Offer","security":[{"apiKey":["offers:read"]}],"responses":{"200":{"description":"Offer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Offer"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateOffer","tags":["offers"],"summary":"Update a Offer","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["offers:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Offer"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Offer"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceOffer","tags":["offers"],"summary":"Create or replace a Offer","security":[{"apiKey":["offers:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Offer"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Offer"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Offer"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteOffer","tags":["offers"],"summary":"Delete a Offer","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["offers:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/offers/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getOfferLineage","tags":["offers"],"summary":"Where each value of a Offer came from","security":[{"apiKey":["audit:read","offers:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/offers":{"post":{"operationId":"bulkOffer","tags":["imports"],"summary":"Bulk create or update Offer records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","offers:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Offer"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Offer"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/placements":{"get":{"operationId":"listPlacements","tags":["placements"],"summary":"List Placement records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["placements:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Placement records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Placement"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createPlacement","tags":["placements"],"summary":"Create a Placement","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["placements:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Placement"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Placement"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Placement"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/placements/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getPlacement","tags":["placements"],"summary":"Retrieve a Placement","security":[{"apiKey":["placements:read"]}],"responses":{"200":{"description":"Placement","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Placement"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updatePlacement","tags":["placements"],"summary":"Update a Placement","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["placements:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Placement"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Placement"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replacePlacement","tags":["placements"],"summary":"Create or replace a Placement","security":[{"apiKey":["placements:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Placement"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Placement"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Placement"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deletePlacement","tags":["placements"],"summary":"Delete a Placement","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["placements:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/placements/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getPlacementLineage","tags":["placements"],"summary":"Where each value of a Placement came from","security":[{"apiKey":["audit:read","placements:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/placements":{"post":{"operationId":"bulkPlacement","tags":["imports"],"summary":"Bulk create or update Placement records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","placements:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Placement"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Placement"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/assignments":{"get":{"operationId":"listAssignments","tags":["assignments"],"summary":"List Assignment records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["assignments:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Assignment records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Assignment"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createAssignment","tags":["assignments"],"summary":"Create a Assignment","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["assignments:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assignment"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assignment"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assignment"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/assignments/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getAssignment","tags":["assignments"],"summary":"Retrieve a Assignment","security":[{"apiKey":["assignments:read"]}],"responses":{"200":{"description":"Assignment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assignment"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateAssignment","tags":["assignments"],"summary":"Update a Assignment","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["assignments:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assignment"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assignment"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceAssignment","tags":["assignments"],"summary":"Create or replace a Assignment","security":[{"apiKey":["assignments:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assignment"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assignment"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assignment"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteAssignment","tags":["assignments"],"summary":"Delete a Assignment","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["assignments:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/assignments/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getAssignmentLineage","tags":["assignments"],"summary":"Where each value of a Assignment came from","security":[{"apiKey":["audit:read","assignments:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/assignments":{"post":{"operationId":"bulkAssignment","tags":["imports"],"summary":"Bulk create or update Assignment records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","assignments:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Assignment"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Assignment"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/timesheets":{"get":{"operationId":"listTimesheets","tags":["timesheets"],"summary":"List Timesheet records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["timesheets:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Timesheet records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Timesheet"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createTimesheet","tags":["timesheets"],"summary":"Create a Timesheet","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["timesheets:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timesheet"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timesheet"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timesheet"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/timesheets/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getTimesheet","tags":["timesheets"],"summary":"Retrieve a Timesheet","security":[{"apiKey":["timesheets:read"]}],"responses":{"200":{"description":"Timesheet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timesheet"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateTimesheet","tags":["timesheets"],"summary":"Update a Timesheet","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["timesheets:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timesheet"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timesheet"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceTimesheet","tags":["timesheets"],"summary":"Create or replace a Timesheet","security":[{"apiKey":["timesheets:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timesheet"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timesheet"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timesheet"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteTimesheet","tags":["timesheets"],"summary":"Delete a Timesheet","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["timesheets:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/timesheets/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getTimesheetLineage","tags":["timesheets"],"summary":"Where each value of a Timesheet came from","security":[{"apiKey":["audit:read","timesheets:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/timesheets":{"post":{"operationId":"bulkTimesheet","tags":["imports"],"summary":"Bulk create or update Timesheet records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","timesheets:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Timesheet"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Timesheet"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/skills":{"get":{"operationId":"listSkills","tags":["skills"],"summary":"List Skill records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["skills:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Skill records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Skill"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createSkill","tags":["skills"],"summary":"Create a Skill","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["skills:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Skill"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Skill"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Skill"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/skills/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getSkill","tags":["skills"],"summary":"Retrieve a Skill","security":[{"apiKey":["skills:read"]}],"responses":{"200":{"description":"Skill","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Skill"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateSkill","tags":["skills"],"summary":"Update a Skill","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["skills:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Skill"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Skill"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceSkill","tags":["skills"],"summary":"Create or replace a Skill","security":[{"apiKey":["skills:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Skill"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Skill"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Skill"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteSkill","tags":["skills"],"summary":"Delete a Skill","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["skills:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/skills/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getSkillLineage","tags":["skills"],"summary":"Where each value of a Skill came from","security":[{"apiKey":["audit:read","skills:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/skills":{"post":{"operationId":"bulkSkill","tags":["imports"],"summary":"Bulk create or update Skill records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","skills:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Skill"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Skill"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/certifications":{"get":{"operationId":"listCertifications","tags":["certifications"],"summary":"List Certification records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["certifications:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Certification records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Certification"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createCertification","tags":["certifications"],"summary":"Create a Certification","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["certifications:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Certification"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Certification"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Certification"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/certifications/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getCertification","tags":["certifications"],"summary":"Retrieve a Certification","security":[{"apiKey":["certifications:read"]}],"responses":{"200":{"description":"Certification","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Certification"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateCertification","tags":["certifications"],"summary":"Update a Certification","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["certifications:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Certification"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Certification"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceCertification","tags":["certifications"],"summary":"Create or replace a Certification","security":[{"apiKey":["certifications:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Certification"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Certification"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Certification"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteCertification","tags":["certifications"],"summary":"Delete a Certification","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["certifications:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/certifications/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getCertificationLineage","tags":["certifications"],"summary":"Where each value of a Certification came from","security":[{"apiKey":["audit:read","certifications:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/certifications":{"post":{"operationId":"bulkCertification","tags":["imports"],"summary":"Bulk create or update Certification records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","certifications:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Certification"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Certification"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/resumes":{"get":{"operationId":"listResumes","tags":["resumes"],"summary":"List Resume records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["resumes:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Resume records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Resume"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createResume","tags":["resumes"],"summary":"Create a Resume","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["resumes:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resume"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resume"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resume"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/resumes/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getResume","tags":["resumes"],"summary":"Retrieve a Resume","security":[{"apiKey":["resumes:read"]}],"responses":{"200":{"description":"Resume","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resume"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateResume","tags":["resumes"],"summary":"Update a Resume","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["resumes:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resume"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resume"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceResume","tags":["resumes"],"summary":"Create or replace a Resume","security":[{"apiKey":["resumes:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resume"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resume"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resume"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteResume","tags":["resumes"],"summary":"Delete a Resume","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["resumes:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/resumes/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getResumeLineage","tags":["resumes"],"summary":"Where each value of a Resume came from","security":[{"apiKey":["audit:read","resumes:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/resumes":{"post":{"operationId":"bulkResume","tags":["imports"],"summary":"Bulk create or update Resume records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","resumes:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Resume"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Resume"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/documents":{"get":{"operationId":"listDocuments","tags":["documents"],"summary":"List Document records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["documents:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Document records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createDocument","tags":["documents"],"summary":"Create a Document","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["documents:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Document"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Document"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Document"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/documents/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getDocument","tags":["documents"],"summary":"Retrieve a Document","security":[{"apiKey":["documents:read"]}],"responses":{"200":{"description":"Document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Document"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateDocument","tags":["documents"],"summary":"Update a Document","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["documents:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Document"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Document"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceDocument","tags":["documents"],"summary":"Create or replace a Document","security":[{"apiKey":["documents:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Document"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Document"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Document"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteDocument","tags":["documents"],"summary":"Delete a Document","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["documents:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/documents/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getDocumentLineage","tags":["documents"],"summary":"Where each value of a Document came from","security":[{"apiKey":["audit:read","documents:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/documents":{"post":{"operationId":"bulkDocument","tags":["imports"],"summary":"Bulk create or update Document records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","documents:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Document"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/talent-pools":{"get":{"operationId":"listTalentPools","tags":["talent-pools"],"summary":"List Talent pool records, incrementally","description":"Returns a keyset-paginated page. Pass `updated_since` from your last `sync_checkpoint` to receive only what changed; follow `next_cursor` until `has_more` is false.","security":[{"apiKey":["talent_pools:read"]}],"parameters":[{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `updated_at`. Pass the `sync_checkpoint` from your last page."},{"name":"created_since","in":"query","schema":{"type":"string","format":"date-time"},"description":"Inclusive lower bound on `created_at`."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from the previous page's `next_cursor`."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":1000,"minimum":1}},{"name":"include_deleted","in":"query","schema":{"type":"boolean","default":false},"description":"Include soft-deleted records so an incremental sync can learn a record went away."}],"responses":{"200":{"description":"A page of Talent pool records.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/TalentPool"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"sync_checkpoint":{"type":["string","null"],"format":"date-time","description":"Pass this as `updated_since` on your next sync. Taken from the last row returned, not the server clock."}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createTalentPool","tags":["talent-pools"],"summary":"Create a Talent pool","description":"Idempotent. A record carrying an `externalId` and `externalSystem` that already exists is updated rather than duplicated.","security":[{"apiKey":["talent_pools:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalentPool"}}}},"responses":{"200":{"description":"Matched an existing record and updated it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalentPool"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalentPool"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/talent-pools/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getTalentPool","tags":["talent-pools"],"summary":"Retrieve a Talent pool","security":[{"apiKey":["talent_pools:read"]}],"responses":{"200":{"description":"Talent pool","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalentPool"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateTalentPool","tags":["talent-pools"],"summary":"Update a Talent pool","description":"Merges the supplied fields. Fields you omit keep their current values, so a feed that owns only some columns cannot blank the rest.","security":[{"apiKey":["talent_pools:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalentPool"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalentPool"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"replaceTalentPool","tags":["talent-pools"],"summary":"Create or replace a Talent pool","security":[{"apiKey":["talent_pools:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalentPool"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalentPool"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalentPool"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteTalentPool","tags":["talent-pools"],"summary":"Delete a Talent pool","description":"Soft delete. The record remains visible to delta reads that pass `include_deleted=true`, so your sync learns it went away.","security":[{"apiKey":["talent_pools:write"]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"deleted":{"type":"boolean","const":true}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/talent-pools/{id}/lineage":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getTalentPoolLineage","tags":["talent-pools"],"summary":"Where each value of a Talent pool came from","security":[{"apiKey":["audit:read","talent_pools:read"]}],"responses":{"200":{"description":"Field-level lineage, newest write per field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"record_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{},"source_system":{"type":["string","null"]},"source_dataset":{"type":["string","null"]},"connector":{"type":["string","null"]},"import_job_id":{"type":["string","null"]},"imported_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bulk/talent-pools":{"post":{"operationId":"bulkTalentPool","tags":["imports"],"summary":"Bulk create or update Talent pool records","description":"Submits an asynchronous job. Post a bare array, or an object with `records`. Poll `/imports/{job_id}` for progress.","security":[{"apiKey":["imports:write","talent_pools:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/TalentPool"}},{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/TalentPool"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string"},"source_dataset":{"type":"string"}}}]}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/imports":{"post":{"operationId":"createImport","tags":["imports"],"summary":"Submit an asynchronous import","description":"Set `dry_run: true` to receive the plan — what would be created, updated, skipped and rejected — without writing anything.","security":[{"apiKey":["imports:write"]}],"parameters":[{"name":"idempotency-key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255},"description":"A key unique to this logical write. Retrying with the same key returns the first response instead of writing twice. Reusing it with a different body is rejected as a conflict."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["entity","records"],"properties":{"entity":{"type":"string","example":"candidate"},"records":{"type":"array","items":{"type":"object"}},"dry_run":{"type":"boolean","default":false},"update_existing":{"type":"boolean","default":true},"source_system":{"type":"string","example":"bullhorn"},"source_dataset":{"type":"string","example":"nightly_candidates"}}}}}},"responses":{"202":{"description":"Job accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/imports/{job_id}":{"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getImport","tags":["imports"],"summary":"Import job progress","security":[{"apiKey":["imports:read"]}],"responses":{"200":{"description":"Job state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob"}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/imports/{job_id}/issues":{"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getImportIssues","tags":["imports"],"summary":"Per-record problems from an import","security":[{"apiKey":["imports:read"]}],"responses":{"200":{"description":"Issues, by row.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"type":"object","properties":{"row":{"type":"integer"},"field":{"type":["string","null"]},"code":{"type":"string"},"severity":{"type":"string","enum":["error","warning"]},"message":{"type":"string"},"value":{"type":["string","null"]}}}}}}}}},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/schemas":{"get":{"operationId":"listSchemas","tags":["schemas"],"summary":"List the canonical entities","security":[{"apiKey":["schemas:read"]}],"responses":{"200":{"description":"Entities."},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/schemas/{entity}":{"parameters":[{"name":"entity","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getSchema","tags":["schemas"],"summary":"Describe one canonical entity, including known source aliases","security":[{"apiKey":["schemas:read"]}],"responses":{"200":{"description":"Entity schema."},"400":{"description":"The request was malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The API key is missing, malformed, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key does not hold the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The idempotency key conflicts with an earlier request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The record failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}