diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 5d0e818..5dd9d74 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,29 +1,29 @@ lockVersion: 2.0.0 id: 0c8d1667-2710-4860-aee3-7d221dbc0a60 management: - docChecksum: a92c8129cc9dc835368c0511c699c112 + docChecksum: 5efa8ce0366654a1c5fadec75c166134 docVersion: 1.0.0 - speakeasyVersion: 1.793.1 - generationVersion: 2.928.0 - releaseVersion: 1.3.7 - configChecksum: e7ddadc6b2a7007e0dc5569bc806aab0 + speakeasyVersion: 1.796.4 + generationVersion: 2.935.1 + releaseVersion: 1.4.0 + configChecksum: f819fbd05ad12ee6a899087de7ff3e68 repoURL: https://github.com/kombohq/python-sdk.git installationURL: https://github.com/kombohq/python-sdk.git published: true persistentEdits: - generation_id: 0a63e49b-ea39-4950-9204-261fbf91e9c2 - pristine_commit_hash: ef3c5cf12f06c2fa41900f69e6c59dc943c07b62 - pristine_tree_hash: 227baccc839b2d2a3e6d732653677f19262af85c + generation_id: 554d955f-786b-40e1-b12f-7f013456db5b + pristine_commit_hash: 6e8721a3adb31847a4458906c6b9455c2379465c + pristine_tree_hash: 41600b847c05bb2d0438540877439a7c8ef45250 features: python: additionalDependencies: 1.1.0 constsAndDefaults: 1.0.7 - core: 6.0.35 + core: 6.1.2 defaultEnabledRetries: 0.2.0 deprecations: 3.0.2 enumUnions: 0.1.1 envVarSecurityUsage: 0.3.3 - errors: 3.4.4 + errors: 3.4.5 flatRequests: 1.0.1 flattening: 3.1.1 globalSecurity: 3.0.7 @@ -41,10 +41,10 @@ features: operationTimeout: 0.3.1 pagination: 3.0.10 responseFormat: 1.1.0 - retries: 3.0.7 + retries: 3.1.2 sdkHooks: 1.3.0 serverIDs: 3.0.0 - unions: 3.1.8 + unions: 3.1.9 webhooks: 2.0.0 trackedFiles: .gitattributes: @@ -79,6 +79,10 @@ trackedFiles: id: b1fb484d1483 last_write_checksum: sha1:81e83a7b945cf4f3d8167d86bbc2bab5927cec6a pristine_git_object: 74377fdc0f33bd591de50242fff6db7ba9fba1a9 + docs/models/amount.md: + id: 437bf42a480e + last_write_checksum: sha1:a93a35a251a17ed9514160734abc844f4dd2fc94 + pristine_git_object: bcaccc5b22b1cc44d3e5a3e0a265f4c7d326a828 docs/models/assesscandidatedata.md: id: 1c1434b54a77 last_write_checksum: sha1:6d5e02105835f41e8a47df7d4368779a027a9c2a @@ -151,10 +155,6 @@ trackedFiles: id: 54f823199f61 last_write_checksum: sha1:d5a84ea8fcfca5297e3cd09e69cfebafe0e60a06 pristine_git_object: 43d7200c25474d5d48cb0d4b34a11555a735f7cc - docs/models/author.md: - id: b4139065dbed - last_write_checksum: sha1:d4e3c295fb055bc76157482e743ad545836ec1ec - pristine_git_object: 45b0e585e05bc5ccd2a4f42f40a53c8cd22deb58 docs/models/bankaccount.md: id: 7d5535aca59c last_write_checksum: sha1:623eafeee453ca1e35c5478fb19d193736cf6865 @@ -171,6 +171,10 @@ trackedFiles: id: e0061a53f9b4 last_write_checksum: sha1:fec9d01cc8a32b3fe43b7e139cf0d35371f44cfc pristine_git_object: 126e3d9fb3c7a5ee4d3173cfde05fb2839094c3d + docs/models/change.md: + id: 305cf3b414fe + last_write_checksum: sha1:4a8df21f98adc8b5870428b5a967c78d4de683e6 + pristine_git_object: afb051e0c10db1dc9c581553b3b3cee9a1d364c8 docs/models/changedmodel.md: id: 9670ed10ecd7 last_write_checksum: sha1:9714af9d05a450e13cdc486f56f9f5711caa8b71 @@ -347,6 +351,10 @@ trackedFiles: id: 15ddcb0fabf7 last_write_checksum: sha1:b104ff14ae13a50f94b0514ea63dbe1d6dae56aa pristine_git_object: 318b6b37cc57b1b9683ed7698ff5ab390630be2b + docs/models/employee.md: + id: d1b548d594fb + last_write_checksum: sha1:ccc276988e1d4fbe41ed8a3e178b6b0d62b49479 + pristine_git_object: db90d0198d653faf3209bae0dfc1270cf5351a35 docs/models/employment.md: id: 667fb08d0582 last_write_checksum: sha1:cf1c8be25c2db286a8bceae47064b74bb5384b9a @@ -409,16 +417,16 @@ trackedFiles: pristine_git_object: c52b15794aace231e0055b8f6b865e4533e407d2 docs/models/formatmultiselect.md: id: c3174d52e2b4 - last_write_checksum: sha1:2d2153955107855fd4f079ae593bec6e4bb7c1ec - pristine_git_object: 9cda57b1a335cc8b3d85147bed37f055214ed94f + last_write_checksum: sha1:68420503aede8152ce92e5d3edb0b09fbd501137 + pristine_git_object: ac8baa5ebcc7a740906269ded54c79f1cb582c58 docs/models/formatnumber.md: id: 38c190f9c178 last_write_checksum: sha1:e4fc3fc3c3077d3d0f9ef69ad79fefc1a530d140 pristine_git_object: 0b978d47a429a488846a84d52cf38d0cc10b2a8f docs/models/formatsingleselect.md: id: 460754d0a818 - last_write_checksum: sha1:850e842cf8d22d1aae082975a24056e15cc0629f - pristine_git_object: 4891ee3fd386cdec23877915a0688b084dbd9da5 + last_write_checksum: sha1:37bad807c2fec061db923e8e78c94e134bf86c8a + pristine_git_object: 9ad452873fbd27b851bd879679241b912834b6aa docs/models/formattext.md: id: 0ae418225de8 last_write_checksum: sha1:88b0de39cf97594c9df835b892dcf7061cfe0ec1 @@ -875,6 +883,14 @@ trackedFiles: id: ea7bd7202365 last_write_checksum: sha1:f43a5b6cd5a7b30ae6840a7d779d366111570c14 pristine_git_object: bbbbe40258585aeb019d5251ae294c00611f779b + docs/models/getatsjobspositiveresponseoption1.md: + id: edba4d692c9d + last_write_checksum: sha1:2e91b097b818c4d6404ee61178099ab5caef1c05 + pristine_git_object: 812ff77ff0ac150ac6c9ba206a3c687312bdb3c4 + docs/models/getatsjobspositiveresponseoption2.md: + id: b3c9e100550b + last_write_checksum: sha1:94ee7e8160470ed31760a424b148a8681e5c4c72 + pristine_git_object: caa9ff5efd41fe8d2f83a469933acd4211a2f98e docs/models/getatsjobspositiveresponseresult.md: id: bc3ee2032568 last_write_checksum: sha1:9b7f07120dda4ff66d8179d35dbb6a59c0e5ce5b @@ -911,14 +927,18 @@ trackedFiles: id: 37f7c83f19c7 last_write_checksum: sha1:dbdcb8d34bf125565cb2a2c3311a3118a5f2f82c pristine_git_object: f22b92eedc6683facfdd11670c697f95ace2ab6b + docs/models/getatsnotespositiveresponseauthor.md: + id: 51fa83d531b6 + last_write_checksum: sha1:9ffa2b4eb93d0f502bca26b1fd2264c97de6cb0e + pristine_git_object: a4c8607857a80fe7b22b56026e0fba773ec371ee docs/models/getatsnotespositiveresponsedata.md: id: a9bf40b75734 last_write_checksum: sha1:1bfb3f12ebfd992419bdec19343f3dcf5da33f33 pristine_git_object: 2dc36d767e9ba67a51090b36364d1e36a1914ae0 docs/models/getatsnotespositiveresponseresult.md: id: 16f52e16ff88 - last_write_checksum: sha1:5da8c13f60d88f8c2171a13946bad7b3f4f7ea62 - pristine_git_object: 8de8e7e789cac1d27ff0ce9334200fcd0da66341 + last_write_checksum: sha1:cc252e273beee01ce3de7b3ab67b996451d0d26d + pristine_git_object: ee813d3769f3fea133fe53af3c8d6ba7dfeb9c18 docs/models/getatsnotesrequest.md: id: 76361a5c0cd2 last_write_checksum: sha1:b04f5f03f5dd86797a25b718eba05706ef7c11fd @@ -1027,6 +1047,50 @@ trackedFiles: id: c6f81bcac6a0 last_write_checksum: sha1:f49396a10f14c05da68cfbc83892d9a71ff67d0a pristine_git_object: 6e1245d913196bc7b637c6b21059aeece7d10ef7 + docs/models/getatsscorecardsglobals.md: + id: 98e2e0f0dc1e + last_write_checksum: sha1:62b83c00e479f5ca01dcf826d09c22cd715d9898 + pristine_git_object: 4ef66a56b2b149c04f47f3944e237a9f9558ef10 + docs/models/getatsscorecardspositiveresponse.md: + id: 1e50a701452c + last_write_checksum: sha1:612c629f0cd78fca7c3496baecaee7283b332059 + pristine_git_object: aded5c25b825357cf3d390f133fd2c92b621982e + docs/models/getatsscorecardspositiveresponseanswer1.md: + id: 06b334eaf0cc + last_write_checksum: sha1:fad37b66428e77be263bb395859cf21077642cfd + pristine_git_object: 975c06a0cd062cfa7bb4c1a312572054972769d8 + docs/models/getatsscorecardspositiveresponseanswer2.md: + id: ff624f86934a + last_write_checksum: sha1:2bdf3e7a78bf9403cafb6a4a7db237f0c698d97c + pristine_git_object: 55bbaacb2f57a36ec1e747fbdc0eb00392629dca + docs/models/getatsscorecardspositiveresponseauthor.md: + id: e39822fa3540 + last_write_checksum: sha1:a000900c615ef695b2e2cbf3346f3ee203896fa9 + pristine_git_object: 0e611a5afe0cb45848e286466ae07c02f2779aea + docs/models/getatsscorecardspositiveresponsedata.md: + id: 1f52c54dc851 + last_write_checksum: sha1:10b1cc0c0c5209e74307a0a6c989b7479daea564 + pristine_git_object: 0200f78126b22bcbf06622bd29edc416d877b6ad + docs/models/getatsscorecardspositiveresponseoption1.md: + id: f248f052e863 + last_write_checksum: sha1:018d14657634a28c37d81e8c6f6e4c215adf4dd9 + pristine_git_object: 48bb72d694a57bf6f738434979b52c8c4f1ebd7d + docs/models/getatsscorecardspositiveresponseoption2.md: + id: 0a6c100cd47e + last_write_checksum: sha1:89aecd0edf6fe6c64a165199bb28e7ce24a86505 + pristine_git_object: 180ab05e8a6656a9437bf309a8991fbdf7bf7be1 + docs/models/getatsscorecardspositiveresponseresult.md: + id: ca7c65feab54 + last_write_checksum: sha1:f48fc68c9ff02a1e2bfcfa736ed6fa8720ee4ea8 + pristine_git_object: 4b5b9db763aaf25c4312ae3b1b173801d978f18b + docs/models/getatsscorecardsrequest.md: + id: 0efedaff6abf + last_write_checksum: sha1:423d93ed81250d0928e6bd1a6141aa1efabcfd73 + pristine_git_object: d63c8473d99ca470a07e0ca0831b24db44e4ab00 + docs/models/getatsscorecardsresponse.md: + id: 353a709a65ad + last_write_checksum: sha1:5cf7b8815677239b3e13e431eb761f044de26272 + pristine_git_object: 756dafffdb1c96ecc643168072d1929581f31290 docs/models/getatstagsglobals.md: id: 3aac9c19e5d8 last_write_checksum: sha1:d6750166d533e37b4fb14ee3d8483cf03e6e99b6 @@ -1479,6 +1543,86 @@ trackedFiles: id: a270858c0896 last_write_checksum: sha1:1c17f44cdfa9906b9ed8373f24df7d8e86231745 pristine_git_object: 8a3bbb1d54e08834cbdc05bbc842556f4d0929af + docs/models/gethrispayrunsglobals.md: + id: 91e169e746d4 + last_write_checksum: sha1:2ff266f18a298c9d80bcf291c94f21f2e3e7473a + pristine_git_object: 75fd95c08d573892699ffee6ad628c11c8ad0412 + docs/models/gethrispayrunspositiveresponse.md: + id: 958481c0c28f + last_write_checksum: sha1:7558267c459c80b4694733364f175c0d5800c804 + pristine_git_object: 1ab9b12febe1484238e99397b55945b871b8de46 + docs/models/gethrispayrunspositiveresponsedata.md: + id: 0198e5f583cd + last_write_checksum: sha1:6426342ee50686d612050ec7e38244bd4b844cb9 + pristine_git_object: 454a5a6a111b08fd86e31b5f52b4bf400491ce33 + docs/models/gethrispayrunspositiveresponsegrosspay.md: + id: 0ce8a8553e90 + last_write_checksum: sha1:ade80b5fd63b7fedbf90e766f7f1f9c12b068bab + pristine_git_object: 5c9961422ef8e28a323eb7bf23eb5369686550e1 + docs/models/gethrispayrunspositiveresponsenetpay.md: + id: 981bcde7ca63 + last_write_checksum: sha1:5e3eeaf5a46095962399ab1a871b61393357c991 + pristine_git_object: b4d922c79d93341358f6fdc5a79ef562259c1fb7 + docs/models/gethrispayrunspositiveresponsepaidamount.md: + id: c95f5ad2dd6b + last_write_checksum: sha1:9b93f8a5c4c547e93d5b2a1aa916315f8adf45fb + pristine_git_object: dc06cdac67cc7a63e0978c29ec6efe283b5e97d5 + docs/models/gethrispayrunspositiveresponseresult.md: + id: 8f7940dc58da + last_write_checksum: sha1:018bfea5b698e6a1c7b3b0d7dfa3a9ef09bdf2c2 + pristine_git_object: 3fbc34063eef5ff14c74a2b5ad6de1e7132d3fef + docs/models/gethrispayrunspositiveresponsetotals.md: + id: 80b82d9353f0 + last_write_checksum: sha1:99e95a047eb7f3f10ce9a6862f2bd09913b33185 + pristine_git_object: 2ca1d88e32219ed45b1b670d195d44e4e9ab95f1 + docs/models/gethrispayrunsrequest.md: + id: 82bc779cfafb + last_write_checksum: sha1:28c37efc2b57c176ca98911d364dd3e7511d2749 + pristine_git_object: 5bd6649ed1ad131d9c158c1d432f492295f37db5 + docs/models/gethrispayrunsresponse.md: + id: 323840af1ffc + last_write_checksum: sha1:67cc927ffa925a14549b16f8ca9b2488e7b72b32 + pristine_git_object: 3a6872332a02c6fe47980705106805de94d3a8e2 + docs/models/gethrispayslipsglobals.md: + id: 0856d7206a87 + last_write_checksum: sha1:69cfd3828aa07e44dd0479261c7f4e755c3b977e + pristine_git_object: d22ea126a369a89bad209a5de5daf84d0b2d9c34 + docs/models/gethrispayslipspositiveresponse.md: + id: 921ea86d5b09 + last_write_checksum: sha1:92a06dea9342f92ceeccd83ede831d7ae6e773b8 + pristine_git_object: 94601e33a9c5818686ac22f21e016a0977b5f47b + docs/models/gethrispayslipspositiveresponsedata.md: + id: 3641b40effc0 + last_write_checksum: sha1:ae384ad1e78692aa5dedc571ee0986d88b1434dc + pristine_git_object: 536494bd0ceeaf0e94ba7e350bd6bed74da1555b + docs/models/gethrispayslipspositiveresponsegrosspay.md: + id: 54bf2017f5c4 + last_write_checksum: sha1:32ea8e61c7763f1f94f794e256c36894a0f0c448 + pristine_git_object: 968a449ab1643567c26f09334e55ffb0a82e7ae2 + docs/models/gethrispayslipspositiveresponsenetpay.md: + id: b0a7aea67ba6 + last_write_checksum: sha1:3d9c0f69e830b165f8fc8857b0d5a34acc365e77 + pristine_git_object: 9a710a7b5cf87556662cbd96c041967ccc239bca + docs/models/gethrispayslipspositiveresponsepaidamount.md: + id: edcefad7d3cb + last_write_checksum: sha1:8ec3616973023c68b3bc7fbe6adb4bce64635217 + pristine_git_object: 894c5d1d4331c284aeb91d304b773e9c8878fe81 + docs/models/gethrispayslipspositiveresponseresult.md: + id: 4513982035ca + last_write_checksum: sha1:2947d3bdc4c0a6905265a1e71c809d3cdd52fc49 + pristine_git_object: 5d3802525598ebde43b722b3e3f4080395bc1f21 + docs/models/gethrispayslipspositiveresponsetotals.md: + id: 39dca590f71c + last_write_checksum: sha1:46209899adcf1da4fb5175a12ff7e4495dc3d950 + pristine_git_object: 8f4ba89ece1985f857430f6e9d44398618b6e3fa + docs/models/gethrispayslipsrequest.md: + id: a175989bb947 + last_write_checksum: sha1:5fcd1efa6393ca2f22b5073c5767409b6f2dd589 + pristine_git_object: 1c23846ea4615473bec95180a107ac228e7680e7 + docs/models/gethrispayslipsresponse.md: + id: dcebe5cad6fb + last_write_checksum: sha1:92b6006816dccfaf4c44558f7bbbed002dfebc4b + pristine_git_object: 035518d8ef18f979371ccc89efa3305a218f8140 docs/models/gethrisperformancereviewcyclesglobals.md: id: a511a27fc46d last_write_checksum: sha1:eeeb7b5905b8f4c68d7f05f107e100289dc59af1 @@ -1867,6 +2011,10 @@ trackedFiles: id: dfee6e2d425f last_write_checksum: sha1:53f3b20f10cb6a6d5d673addf3b1e368c2a0b8bd pristine_git_object: 84182680c82d649cccda200a014b1fc35d11eafe + docs/models/integration.md: + id: cc3390477324 + last_write_checksum: sha1:5879a01ad0f58d21a0886ac504e132948ecd32c0 + pristine_git_object: e39a44d3e4cf3d947e97125d584506d504c08193 docs/models/integrationcreatedwebhookpayload.md: id: f0e4afd49521 last_write_checksum: sha1:ea15acb8ead5725cdaa0ea7a4b6fe8a5f54c5484 @@ -1933,8 +2081,8 @@ trackedFiles: pristine_git_object: 95d7af043b98494373f18f3ceae6a530e7e4af71 docs/models/integrationtool.md: id: 59f82e2d180c - last_write_checksum: sha1:040bc72fc0c85deec7c4b9c260535385294cb5f1 - pristine_git_object: 5239d66ec7ca53962c8b00599903e91a115df482 + last_write_checksum: sha1:02bc6d04ec7f73290a681f8533fce4e9e9be2374 + pristine_git_object: bd35e339b00d486af7be406f4d666d0e4b6d31d2 docs/models/internal/globals.md: id: 9c173b87f41f last_write_checksum: sha1:3969d44e1ad9258f466c40b241681eb82c1ac29a @@ -1943,6 +2091,34 @@ trackedFiles: id: 1d78740fed83 last_write_checksum: sha1:8fa11fb5481af7d7a06603194b8aa5bb29e0d0d6 pristine_git_object: b6cdfb88cd1a221049ad41c24f45fca0ecba2dc8 + docs/models/issue.md: + id: 44d611a73cb7 + last_write_checksum: sha1:d25248015d574baaa2e5cf1fe2b77bfc97520ad2 + pristine_git_object: 0bef3e3a7d9961cd0cbdfb92555e3145a0d9d21b + docs/models/issuestatuschangedwebhookpayload.md: + id: 4cd68c5912a6 + last_write_checksum: sha1:7e07c8886154ce38919593381a83827906bc7d7c + pristine_git_object: 8a9d2eb94ff974617de1c7a30522a9037eca5af6 + docs/models/issuestatuschangedwebhookpayloadcategory.md: + id: 531a0ec2aeb9 + last_write_checksum: sha1:f51933ce32bedd18052bb5a56d357afa9125a2ab + pristine_git_object: 0dee08e2923d9f83691e2d61809842a1bdc11240 + docs/models/issuestatuschangedwebhookpayloaddata.md: + id: dd9a24ef08fe + last_write_checksum: sha1:924a52960e1b0d8412d558c10b9f3cdf52711484 + pristine_git_object: 7e1cae706276f7d1b996de2950b5a8c81127bc68 + docs/models/issuestatuschangedwebhookpayloadenduser.md: + id: 8075262f1283 + last_write_checksum: sha1:ab24db8a4047e7ea00384a9c638491c864830f8e + pristine_git_object: 6519467a3b91511ddb7bdee4a431401f21d1398e + docs/models/issuestatuschangedwebhookpayloadstatus.md: + id: b198f7884f9c + last_write_checksum: sha1:a662370a3c9aab6763babfd6aa5fbd6e213791a6 + pristine_git_object: 6a9e551e752444a8c6aa3767881c34b7fd38f217 + docs/models/issuestatuschangedwebhookpayloadtype.md: + id: 3863263d818f + last_write_checksum: sha1:7887e79b708eae07fc62e650c881474474c4e0cc + pristine_git_object: 7ad28237a579ad0e89699d9cb8fe22fbb8dae3bf docs/models/jobposting.md: id: 631bc79a3eab last_write_checksum: sha1:9f49903f9e1986685334da86df2b31edf495c6c2 @@ -1999,6 +2175,10 @@ trackedFiles: id: ca863b1b80c1 last_write_checksum: sha1:812a33efa3edb2044daaab7aae2c1a3cf595ea1e pristine_git_object: 2e5d5dac33e72f4cf8981a4ae1cb5eb0db3677ce + docs/models/lineitem.md: + id: 946ed7dd10b9 + last_write_checksum: sha1:def49cf06e47313bbf177932e3749da01afd7262 + pristine_git_object: 5ddffe77010ab4219bbc114e1be70e8daed75b88 docs/models/manager.md: id: 475dd5a54e8a last_write_checksum: sha1:24ea1923a0a2365c3df1937cb3fcf7d32f0b3efe @@ -2025,8 +2205,8 @@ trackedFiles: pristine_git_object: 61484b6897a799eaefce5b61a74f6bc7a1371218 docs/models/name.md: id: 6ee802922293 - last_write_checksum: sha1:0c814b2d482acefa687358fb9070e023d12159ed - pristine_git_object: 3f8c6f4883811e7d5613ba99c9bbdfdea3c30437 + last_write_checksum: sha1:4459f8bc79124cbca5f2af559c92676f0f781e52 + pristine_git_object: 0c88392d5912ae545d7e58754baef2c56d85c330 docs/models/offer.md: id: e20e1bb1fed4 last_write_checksum: sha1:f57b5704c7ffdc90d0d5af4f8e736668d185ee70 @@ -2035,14 +2215,6 @@ trackedFiles: id: 5674373d7fe2 last_write_checksum: sha1:fd42e0b62d4ee44353443057503e2abc08701885 pristine_git_object: a891c7797cf6282f81f4c55b55c8b39f600e9e41 - docs/models/option1.md: - id: d2833b9b84a7 - last_write_checksum: sha1:397f5ddb66682fcd504c3aa0c14add7af2ec05bf - pristine_git_object: b851354435be877aab13c09db541961c527eb9f8 - docs/models/option2.md: - id: 4c9e1b965d62 - last_write_checksum: sha1:2be231fc0dcf6da7c0ce1ca07f23cbf459e57377 - pristine_git_object: 13a0548b829caaa595425afd466039f97260ca37 docs/models/orderedoption.md: id: 957ee74ef883 last_write_checksum: sha1:fcc738fa1fdec584ba09b403404cb84124a066da @@ -2067,6 +2239,10 @@ trackedFiles: id: f0e24a2fe282 last_write_checksum: sha1:85455ee950eb8de4eb2c2efa014cdb02070e878f pristine_git_object: 51c9cf5b0108fec5c68d8ae006269005dfe5b32f + docs/models/payrun.md: + id: 5ba90dd6de7a + last_write_checksum: sha1:8cc23ceb992ae468622236e0f598d468b0772f0e + pristine_git_object: f24052839f9baad8bc40c5febb98af58a1729d9e docs/models/postatsapplicationsapplicationidattachmentsglobals.md: id: 1c51c042e6de last_write_checksum: sha1:1fd9d2d4ef90bb7bddaf7a2cffea06f1b2d5489f @@ -3879,6 +4055,34 @@ trackedFiles: id: 2e8544d79e83 last_write_checksum: sha1:ae0e71269c0454819280293aa7b40fa416af6440 pristine_git_object: 0fc55218be67d6fd1945b8165301c562d9491d4b + docs/models/response.md: + id: 583c991c7a30 + last_write_checksum: sha1:2e766e3a1d1e57f83763020bf7b13c0e58e02a1a + pristine_git_object: 4ade32cfa2a1bc73d7e4a338a4f396ed9c377297 + docs/models/resultboolean.md: + id: f5645923b019 + last_write_checksum: sha1:fc310830964088e7c99cd24795bee37244830ab8 + pristine_git_object: ddf0342aa7f266a236872a6eb88f1a81a9ecc2b1 + docs/models/resultdate.md: + id: 2c4f675d8552 + last_write_checksum: sha1:df0145ecbb175b5ce9ba28e17caac601ac1ee242 + pristine_git_object: abbcc4b2c0005536939add93c252c772444b5711 + docs/models/resultmultiselect.md: + id: c2ad94d615b4 + last_write_checksum: sha1:0b6cb3a63858200287303785ce87f18341917f7e + pristine_git_object: d100078d19d6b2cbaf723b30a1055f21412856db + docs/models/resultnumber.md: + id: d1377ccf32c0 + last_write_checksum: sha1:f5e7d430a2dc8fd72784bc327dfed52f3c3d5e6d + pristine_git_object: d0bf839095507740851258b5946315de3c44ccd0 + docs/models/resultsingleselect.md: + id: f8648633d089 + last_write_checksum: sha1:95de3cde3dbfaeea26bc41b0c1e3d8bf7e67bc84 + pristine_git_object: 9059fd5de13fcab28f387531fec3d8b6f30e467b + docs/models/resulttext.md: + id: 0150ce9e5243 + last_write_checksum: sha1:836a954e62d00fe054d796d22d67741819d7b8fe + pristine_git_object: e08354091863082860b0636708021775fe3644dc docs/models/reviewcycle.md: id: 8e1aefc20477 last_write_checksum: sha1:5b379228d2d8dc4ff128a661225cb5fb0a09de3f @@ -4255,6 +4459,10 @@ trackedFiles: id: 55f3128e3cf4 last_write_checksum: sha1:1502817162c350607a1e47e40989783b6f8e3a3d pristine_git_object: 240cbf8ad86c517d1c5cbfbf0390a0586b8c5b8c + docs/models/webhookissuestatuschangedwebhookpayloadrequest.md: + id: 07ef2e996e0c + last_write_checksum: sha1:048588593f4ac7e4b4d674bac8767f2537f7c2c0 + pristine_git_object: 3678e9f745f7f1154e5d82f8fbb7382ee9e14885 docs/models/webhooksyncfinishedwebhookpayloadrequest.md: id: f7ef11979705 last_write_checksum: sha1:42df7de4d3ab3e860f4ac2bbe4e3726335aa4573 @@ -4277,20 +4485,20 @@ trackedFiles: pristine_git_object: 4c4d8d825ac4d8a2c1f9fa6276ed9dc4911b3517 docs/sdks/ats/README.md: id: 24fafa267f6c - last_write_checksum: sha1:79436ec58bad4581d5e5469245ee4a74348243cd - pristine_git_object: 3a9eaf442d1dd6097498dedacedb567dc1ba25d5 + last_write_checksum: sha1:72fe726c6fa6d86c898f73679100459034edf373 + pristine_git_object: 46ddf3092a24932a33530ea49a22e0428e174fd1 docs/sdks/connect/README.md: id: 074a4658c86b last_write_checksum: sha1:bd6fbc64f979f12a97cfffa056093f5b27fada0c pristine_git_object: cb268794ca5a2389305a908323d1585a0c88d9c4 docs/sdks/general/README.md: id: ce0ada6fa2e1 - last_write_checksum: sha1:dd3422b410ece7ebb279cd908aa8fb55b9206d2d - pristine_git_object: 20c84302a69aafe7482c2d1efa3e224366091242 + last_write_checksum: sha1:22f0c24cf0d7a09b33140d8aba3fbcc96e546a4e + pristine_git_object: 912fd6029f5b9c2a847c665484ab45c5a2050eea docs/sdks/hris/README.md: id: 0baa868a038c - last_write_checksum: sha1:665a575148e6fbba603b2662b20ebe842575922f - pristine_git_object: 49bdc16d152d68e32adf180d2762230c2213a2ac + last_write_checksum: sha1:35762347ee9123a36d6611eeba3531ee46f82e36 + pristine_git_object: f9c3cfb59424760eedbeefba6ad67cff1216dcad py.typed: id: 258c3ed47ae4 last_write_checksum: sha1:8efc425ffe830805ffcc0f3055871bdcdc542c60 @@ -4301,8 +4509,8 @@ trackedFiles: pristine_git_object: f456032107a9387ba6c98afd1c981df2f4b3d636 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:6ec5c6702ea1d11f6d2d4222ae055b5c95ebce0b - pristine_git_object: 4f115ab7b67c637c648d9d146a6145f46412b9a6 + last_write_checksum: sha1:48d85b3a4750717c62f07210c8fd5f9a8407f584 + pristine_git_object: 61f65460b132961b68804feb21188ea8b926b188 scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:b6ad6f0515a952d7cb052befddb6a117d4f627d8 @@ -4329,16 +4537,16 @@ trackedFiles: pristine_git_object: 460080ad13f20f8eac822635c7778a371e892c5d src/kombo/_version.py: id: 45cf440ad1df - last_write_checksum: sha1:3fb42e2d127f194a41382c274bdada49923432b3 - pristine_git_object: 70412efa95be522102d7560b2e0792ae7ed50e39 + last_write_checksum: sha1:db05478262b45ef201ed089dc6a5af5ea5d5aa54 + pristine_git_object: dfe1347308054cd19144e541ef43c36562585a6b src/kombo/assessment.py: id: aec6e8a7589f last_write_checksum: sha1:4d155741d6e52c6b6fcb93cccb6dd2efd191cfb5 pristine_git_object: b2c845ee7e48489c5dcccb8893d7ca6c8ad123bf src/kombo/ats.py: id: a9839762f5c3 - last_write_checksum: sha1:0e321bab6398f4a329770563d00cd11b0eedb49a - pristine_git_object: c69e997f402dac63afbf56a04a62f922660ac9a2 + last_write_checksum: sha1:84cf24f2b424a1ae1cafefb28189a584d29b550a + pristine_git_object: 5205378ba872e91b211591854bfb3aeb63a19617 src/kombo/basesdk.py: id: 8f30a0bd36ff last_write_checksum: sha1:f7cceecb507a387fd50740b9f4cd3cfe5cb3451b @@ -4381,20 +4589,20 @@ trackedFiles: pristine_git_object: 16ac2977e80b6eabe4020aa8a21dd28e83032f9a src/kombo/general.py: id: 107ecb9f3651 - last_write_checksum: sha1:9ce71d1fd6e63e1570b1087402e324df2a139545 - pristine_git_object: 7bbf279e18849e7a25e75d6cb49fc500d1396838 + last_write_checksum: sha1:17192d25fbf37d1b8a85f6e27c7c59751b9bbfa1 + pristine_git_object: c2bff81b2debf6463209166b1618e9267fd7e941 src/kombo/hris.py: id: 9ba1b37ab10a - last_write_checksum: sha1:065fedaabedc7b3d359198cc3268d20d8cd3fb37 - pristine_git_object: 62e8579555cc9aea896b8d564fcc991e62b4296e + last_write_checksum: sha1:44866f436b8aacd94fc5f041da5ee84d965285f0 + pristine_git_object: fd59c773c25fa979123fe8516b1469d4400f31cd src/kombo/httpclient.py: id: 4e74c7821304 last_write_checksum: sha1:5e55338d6ee9f01ab648cad4380201a8a3da7dd7 pristine_git_object: 89560b566073785535643e694c112bedbd3db13d src/kombo/models/__init__.py: id: 45e6e8c7f07f - last_write_checksum: sha1:784806c6e4f3742c62651f875b714475eb76844e - pristine_git_object: 766586df7c4efea2df41e01168407a51430abe69 + last_write_checksum: sha1:db3b04156fee271f8b5f54b22e89b9e5eea48fab + pristine_git_object: 048144216ef586e125f23f255b544b8611d652a9 src/kombo/models/assessmentorderreceivedwebhookpayload.py: id: 532c2db2ee93 last_write_checksum: sha1:a89544ec063f76ec1faa875bf51141a32963ef51 @@ -4405,8 +4613,8 @@ trackedFiles: pristine_git_object: ab1a25921a9f02ed68cee5bfad5b7c6f567acd82 src/kombo/models/datachangedwebhookpayload.py: id: a4be1cf7f915 - last_write_checksum: sha1:10cd92f6f49a21b6b5ba8d6e3a3051aa28c661db - pristine_git_object: c5212e6620121a2f590f30a720057c82f7a07ecb + last_write_checksum: sha1:f07691ab12e582a0dfe26a11bcf7bca476b4adf5 + pristine_git_object: 20aad44c612f5943f509a0525fa2b0e144da3f47 src/kombo/models/deleteatscandidatescandidateidtagsop.py: id: e636f19f3437 last_write_checksum: sha1:88443050e0c1c2de5c660f3b2ddc92c49d022e44 @@ -4513,16 +4721,16 @@ trackedFiles: pristine_git_object: a2c306c08bb1fec21cb4249cac421701bc45a1dd src/kombo/models/getatsjobspositiveresponse.py: id: 99a8e27010c9 - last_write_checksum: sha1:647a47331b6ac00f60af259318ef5cb5c0666d31 - pristine_git_object: 0388b8cc743afb9a41e25688d67447e7589aab8b + last_write_checksum: sha1:3b462a57434b0952045175dff37df7391fc4a42c + pristine_git_object: e65ec63e4ecdd211fbf3c01227990f1a7b37faa6 src/kombo/models/getatsnotesop.py: id: 6da712c9c1bf last_write_checksum: sha1:071b69772a37d1b05dfc12d320f7662622631787 pristine_git_object: 64e4833fa0124d31b4cabfb13a66ac4f890ac98e src/kombo/models/getatsnotespositiveresponse.py: id: c5c19b58d67e - last_write_checksum: sha1:ab444a4ff072ddd95f883bb142d9cd1c63e83380 - pristine_git_object: 9982d555917452ee36da628adde4fd62f32ec98b + last_write_checksum: sha1:9d0539384eceed9839b4ce8ab4a2657b3f460d68 + pristine_git_object: dc9be60df68088287efefa193eef6b26c92ec89e src/kombo/models/getatsoffersop.py: id: e7ea828aed53 last_write_checksum: sha1:c73c8851a6dd5414658e0edb45dadcd9da337a8b @@ -4547,6 +4755,14 @@ trackedFiles: id: 7a0f5dded887 last_write_checksum: sha1:f30de94287e5cbf81a175f4a3d81a08f5eeeab9b pristine_git_object: 95c8b3376aeb59614a0cccec734b8e64bb86b721 + src/kombo/models/getatsscorecardsop.py: + id: b76a72b81aee + last_write_checksum: sha1:4a31c41c7549a8dbf4194b76cb23d6b52fbb6f54 + pristine_git_object: 64f4f01211edcd05695297c8a963cfb2dff354c4 + src/kombo/models/getatsscorecardspositiveresponse.py: + id: e5f1bc3b2b2a + last_write_checksum: sha1:a7d6aacb9cebdc64083c3a2cdb921d2772dcefdc + pristine_git_object: 199489cc97ee811e2dc60ad2ab28f01ed544e81e src/kombo/models/getatstagsop.py: id: 106922ec5228 last_write_checksum: sha1:c66e9b1b93e2179024f92b6588d0c7f36f1603e9 @@ -4647,6 +4863,22 @@ trackedFiles: id: 3556e7b1020c last_write_checksum: sha1:0f628cb2309f2a4d345295001bd9c4dac8738d83 pristine_git_object: dd4d8bedb41f9c53e29b5cd31d74158db6fee159 + src/kombo/models/gethrispayrunsop.py: + id: cee7487c3430 + last_write_checksum: sha1:53fa34e657f606507c3f343c569a5b522c427729 + pristine_git_object: 3a9cd72e65176561bd61e6889d6e56a9b179e502 + src/kombo/models/gethrispayrunspositiveresponse.py: + id: da5f7c9019f4 + last_write_checksum: sha1:8cdd5f4e4a386ed6b35919dee8df9a9596eb89d9 + pristine_git_object: c26d99d77a92800fb5d10dde87a0c460dcb70457 + src/kombo/models/gethrispayslipsop.py: + id: c5bed69919a3 + last_write_checksum: sha1:400924429d06a3b4d65a8a1ff7e64631e0be5910 + pristine_git_object: aeea3ad6b5a6442858c31b4be215df75a07c1499 + src/kombo/models/gethrispayslipspositiveresponse.py: + id: 31addaacfccf + last_write_checksum: sha1:24cf2af80fd666691c7c8dbdd5d6f8c285fbd0cd + pristine_git_object: 654a839494a6b2a7f934c8f561cf64f16dde021c src/kombo/models/gethrisperformancereviewcyclesop.py: id: 531d13c1919b last_write_checksum: sha1:b36d63a3f77016394bbf6bf444d01b410b2e2d26 @@ -4747,6 +4979,10 @@ trackedFiles: id: 182df04d8a5a last_write_checksum: sha1:ba0abb7c79f7a36febdd742132514abacbad7210 pristine_git_object: 01d246f0f0143c1df2b214c968138d4f7c63b6b2 + src/kombo/models/issuestatuschangedwebhookpayload.py: + id: afad57a02bf5 + last_write_checksum: sha1:2450bda00124520074ff39652d2bba20b0a84397 + pristine_git_object: 4be9bca7c4379541254efaa1484688f57564c683 src/kombo/models/komboatserror.py: id: 5ab918f31c61 last_write_checksum: sha1:1a06ff57d69ee43a245d4745a582fbd5969fdb4c @@ -4897,8 +5133,8 @@ trackedFiles: pristine_git_object: 91e8d75513c8015aeb3f8dd2e38e2ec090b0770c src/kombo/models/postconnectcreatelinkrequestbody.py: id: 8ae6871fd392 - last_write_checksum: sha1:76ae90970f244cc9fb3657e1736f9c971f3bbaa4 - pristine_git_object: 67f43abbe3cf668ed23099d8af9d2210dd1b2538 + last_write_checksum: sha1:e10fc5abebb5c6bc10163faf79a0846ecb5247ef + pristine_git_object: 266f7edccff3b980b4f1ea8ee67745ceb200ade0 src/kombo/models/postforcesyncop.py: id: 695738b0e4fb last_write_checksum: sha1:4288d66c5efda40419ee3602e124d5186662a99e @@ -5091,6 +5327,10 @@ trackedFiles: id: 87cff2509bce last_write_checksum: sha1:1682fe7037fa59c05cdd6917fe1ad468fb1dfcfa pristine_git_object: 75f5d85277a7b76a28ae978e7ac998e3b2c3fd46 + src/kombo/models/webhookissuestatuschangedwebhookpayloadop.py: + id: e5653b0bf231 + last_write_checksum: sha1:f72dbf782f16b768fcfefeb2bcfbd69607d1df1b + pristine_git_object: 6461e1b387b6c102a372783f1e92d8507a83b928 src/kombo/models/webhooksyncfinishedwebhookpayloadop.py: id: 54ad6db10280 last_write_checksum: sha1:64f5c709c12e7bbb78e9f55cf8b30f40b3d090ec @@ -5169,8 +5409,8 @@ trackedFiles: pristine_git_object: 591415af8e64baa410627b507d2740afb5387d13 src/kombo/utils/retries.py: id: bc594ff11adc - last_write_checksum: sha1:3585b891142f30a597fbf7a2f0340700babef8e4 - pristine_git_object: ca7b59efebbbd9545744d0207ef42725c4cc5143 + last_write_checksum: sha1:251e4dd969bb6c06025afe1bad1b5035e94c2060 + pristine_git_object: 406c1e7c36c7a4fa4fb48bb567d254e2803e1792 src/kombo/utils/security.py: id: acd4ded0aa8d last_write_checksum: sha1:c11eef495b6aaa249178c24c796940cc540b7a00 @@ -5189,8 +5429,8 @@ trackedFiles: pristine_git_object: c78ccbae426ce6d385709d97ce0b1c2813ea2418 src/kombo/utils/values.py: id: 089c05c60fc5 - last_write_checksum: sha1:acaa178a7c41ddd000f58cc691e4632d925b2553 - pristine_git_object: dae01a44384ac3bc13ae07453a053bf6c898ebe3 + last_write_checksum: sha1:65e1ee8607767a4fc1ae7a55c74d77a23ab3cef1 + pristine_git_object: ac217f473c5d52a454a2979b3eb35e66175d365c examples: webhookDataChangedWebhookPayload: speakeasy-default-webhook-data-changed-webhook-payload: @@ -7840,8 +8080,154 @@ examples: responses: default: application/json: {"status": "error", "error": {"code": null, "title": null, "message": "The message is always in the response.", "log_url": null}} + GetHrisPayRuns: + speakeasy-default-get-hris-pay-runs: + parameters: + query: + page_size: 100 + include_deleted: false + ignore_unsupported_filters: false + header: + X-Integration-Id: "workday:HWUTwvyx2wLoSUHphiWVrp28" + responses: + "200": + application/json: {"status": "success", "data": {"next": "eyJwYWdlIjoxMiwibm90ZSI6InRoaXMgaXMganVzdCBhbiBleGFtcGxlIGFuZCBub3QgcmVwcmVzZW50YXRpdmUgZm9yIGEgcmVhbCBjdXJzb3IhIn0=", "results": [{"id": "HdyE3KNfcbNzXFRqwW1Wh2eP", "remote_id": "300000092871122", "start_date": "2026-01-01T00:00:00Z", "end_date": "2026-01-13T00:00:00Z", "legal_entity_id": "3Y6vdh2SPujGVx8oj4g8hdUu", "changed_at": "2026-01-10T12:32:01Z", "remote_deleted_at": null, "totals": {"gross_pay": {"currency": "USD", "value": 435300}, "net_pay": {"currency": "USD", "value": 362300}, "paid_amount": {"currency": "USD", "value": 306300.26}}}]}} + default: + application/json: {"status": "error", "error": {"code": "HRIS.EMPLOYEE_ALREADY_EXISTS", "title": "", "message": "", "log_url": "https://bleak-creature.name/"}} + example1: + parameters: + query: + page_size: 100 + include_deleted: false + ignore_unsupported_filters: false + header: + X-Integration-Id: "workday:HWUTwvyx2wLoSUHphiWVrp28" + responses: + "200": + application/json: {"status": "success", "data": {"next": "eyJwYWdlIjoxMiwibm90ZSI6InRoaXMgaXMganVzdCBhbiBleGFtcGxlIGFuZCBub3QgcmVwcmVzZW50YXRpdmUgZm9yIGEgcmVhbCBjdXJzb3IhIn0=", "results": [{"id": "HdyE3KNfcbNzXFRqwW1Wh2eP", "remote_id": "300000092871122", "start_date": "2026-01-01T00:00:00Z", "end_date": "2026-01-13T00:00:00Z", "legal_entity_id": "3Y6vdh2SPujGVx8oj4g8hdUu", "changed_at": "2026-01-10T12:32:01Z", "remote_deleted_at": null, "totals": {"gross_pay": {"currency": "USD", "value": 435300}, "net_pay": {"currency": "USD", "value": 362300}, "paid_amount": {"currency": "USD", "value": 306300.26}}}]}} + Error Response: + parameters: + query: + page_size: 100 + include_deleted: false + ignore_unsupported_filters: false + header: + X-Integration-Id: "workday:HWUTwvyx2wLoSUHphiWVrp28" + responses: + default: + application/json: {"status": "error", "error": {"code": "INTEGRATION.MODEL_NOT_AVAILABLE", "title": "This data model isn't supported for the selected integration.", "message": "The \"employees\" model is not yet available for Greenhouse. Please reach out to Kombo if you need this functionality.", "log_url": "https://app.kombo.dev/my-prod/logs?interactionId=123456"}} + Minimal Error Response: + parameters: + query: + page_size: 100 + include_deleted: false + ignore_unsupported_filters: false + header: + X-Integration-Id: "workday:HWUTwvyx2wLoSUHphiWVrp28" + responses: + default: + application/json: {"status": "error", "error": {"code": null, "title": null, "message": "The message is always in the response.", "log_url": null}} + GetHrisPayslips: + speakeasy-default-get-hris-payslips: + parameters: + query: + page_size: 100 + include_deleted: false + ignore_unsupported_filters: false + header: + X-Integration-Id: "workday:HWUTwvyx2wLoSUHphiWVrp28" + responses: + "200": + application/json: {"status": "success", "data": {"next": "eyJwYWdlIjoxMiwibm90ZSI6InRoaXMgaXMganVzdCBhbiBleGFtcGxlIGFuZCBub3QgcmVwcmVzZW50YXRpdmUgZm9yIGEgcmVhbCBjdXJzb3IhIn0=", "results": [{"id": "E4q8YceHEtPWeGwBAEcd9xPs", "remote_id": "300000331094861", "changed_at": "2026-01-10T12:32:01Z", "remote_deleted_at": null, "totals": {"gross_pay": {"currency": "USD", "value": 2207.75}, "net_pay": {"currency": "USD", "value": 1730.35}, "paid_amount": {"currency": "USD", "value": 1730.35}}, "employee": {"id": "26vafvWSRmbhNcxJYqjCzuJg", "remote_id": "32", "first_name": "John", "last_name": "Doe", "display_full_name": "John Doe", "work_email": "john.doe@acme.com", "remote_deleted_at": null}, "pay_run": {"id": "HdyE3KNfcbNzXFRqwW1Wh2eP", "remote_id": "300000092871122", "start_date": "2026-01-01T00:00:00Z", "end_date": "2026-01-13T00:00:00Z", "legal_entity_id": "3Y6vdh2SPujGVx8oj4g8hdUu"}, "line_items": [{"id": "8TMenmF8QVyP1EqagstHhsPG", "remote_id": "300000331094861:REGULAR_SALARY", "name": "Regular Salary", "amount": {"currency": "USD", "value": 2207.75}}, {"id": "CELfyfzuHs6Dz1MDPdoSCY3U", "remote_id": "300000331094861:FIT_WITHHELD", "name": "FIT Withheld", "amount": {"currency": "USD", "value": 235.94}}, {"id": "H1gPqyuZTK3y75NRxe4QZ3u7", "remote_id": "300000331094861:SOCIAL_SECURITY_EMPLOYEE_WITHHELD", "name": "Social Security Employee Withheld", "amount": {"currency": "USD", "value": 136.88}}, {"id": "HEnJXik92Qqph5SX4NtK6NRM", "remote_id": "300000331094861:MEDICARE_EMPLOYEE_WITHHELD", "name": "Medicare Employee Withheld", "amount": {"currency": "USD", "value": 32.01}}, {"id": "Ho16emGY5zVYeEc2nN9CWeKv", "remote_id": "300000331094861:SIT_WITHHELD_CA", "name": "SIT Withheld (CA)", "amount": {"currency": "USD", "value": 71.47}}, {"id": "9D24qXFEp1pSQ2Y3jaRFSTBQ", "remote_id": "300000331094861:VPDI_EMPLOYEE_WITHHELD_CA", "name": "VPDI Employee Withheld (CA)", "amount": {"currency": "USD", "value": 1.1}}]}]}} + default: + application/json: {"status": "error", "error": {"code": "HRIS.EMPLOYEE_ALREADY_EXISTS", "title": "", "message": "", "log_url": "https://shiny-deck.org"}} + example1: + parameters: + query: + page_size: 100 + include_deleted: false + ignore_unsupported_filters: false + header: + X-Integration-Id: "workday:HWUTwvyx2wLoSUHphiWVrp28" + responses: + "200": + application/json: {"status": "success", "data": {"next": "eyJwYWdlIjoxMiwibm90ZSI6InRoaXMgaXMganVzdCBhbiBleGFtcGxlIGFuZCBub3QgcmVwcmVzZW50YXRpdmUgZm9yIGEgcmVhbCBjdXJzb3IhIn0=", "results": [{"id": "E4q8YceHEtPWeGwBAEcd9xPs", "remote_id": "300000331094861", "changed_at": "2026-01-10T12:32:01Z", "remote_deleted_at": null, "totals": {"gross_pay": {"currency": "USD", "value": 2207.75}, "net_pay": {"currency": "USD", "value": 1730.35}, "paid_amount": {"currency": "USD", "value": 1730.35}}, "employee": {"id": "26vafvWSRmbhNcxJYqjCzuJg", "remote_id": "32", "first_name": "John", "last_name": "Doe", "display_full_name": "John Doe", "work_email": "john.doe@acme.com", "remote_deleted_at": null}, "pay_run": {"id": "HdyE3KNfcbNzXFRqwW1Wh2eP", "remote_id": "300000092871122", "start_date": "2026-01-01T00:00:00Z", "end_date": "2026-01-13T00:00:00Z", "legal_entity_id": "3Y6vdh2SPujGVx8oj4g8hdUu"}, "line_items": [{"id": "8TMenmF8QVyP1EqagstHhsPG", "remote_id": "300000331094861:REGULAR_SALARY", "name": "Regular Salary", "amount": {"currency": "USD", "value": 2207.75}}, {"id": "CELfyfzuHs6Dz1MDPdoSCY3U", "remote_id": "300000331094861:FIT_WITHHELD", "name": "FIT Withheld", "amount": {"currency": "USD", "value": 235.94}}, {"id": "H1gPqyuZTK3y75NRxe4QZ3u7", "remote_id": "300000331094861:SOCIAL_SECURITY_EMPLOYEE_WITHHELD", "name": "Social Security Employee Withheld", "amount": {"currency": "USD", "value": 136.88}}, {"id": "HEnJXik92Qqph5SX4NtK6NRM", "remote_id": "300000331094861:MEDICARE_EMPLOYEE_WITHHELD", "name": "Medicare Employee Withheld", "amount": {"currency": "USD", "value": 32.01}}, {"id": "Ho16emGY5zVYeEc2nN9CWeKv", "remote_id": "300000331094861:SIT_WITHHELD_CA", "name": "SIT Withheld (CA)", "amount": {"currency": "USD", "value": 71.47}}, {"id": "9D24qXFEp1pSQ2Y3jaRFSTBQ", "remote_id": "300000331094861:VPDI_EMPLOYEE_WITHHELD_CA", "name": "VPDI Employee Withheld (CA)", "amount": {"currency": "USD", "value": 1.1}}]}]}} + Error Response: + parameters: + query: + page_size: 100 + include_deleted: false + ignore_unsupported_filters: false + header: + X-Integration-Id: "workday:HWUTwvyx2wLoSUHphiWVrp28" + responses: + default: + application/json: {"status": "error", "error": {"code": "INTEGRATION.MODEL_NOT_AVAILABLE", "title": "This data model isn't supported for the selected integration.", "message": "The \"employees\" model is not yet available for Greenhouse. Please reach out to Kombo if you need this functionality.", "log_url": "https://app.kombo.dev/my-prod/logs?interactionId=123456"}} + Minimal Error Response: + parameters: + query: + page_size: 100 + include_deleted: false + ignore_unsupported_filters: false + header: + X-Integration-Id: "workday:HWUTwvyx2wLoSUHphiWVrp28" + responses: + default: + application/json: {"status": "error", "error": {"code": null, "title": null, "message": "The message is always in the response.", "log_url": null}} + GetAtsScorecards: + speakeasy-default-get-ats-scorecards: + parameters: + query: + page_size: 100 + include_deleted: false + ignore_unsupported_filters: false + header: + X-Integration-Id: "workday:HWUTwvyx2wLoSUHphiWVrp28" + responses: + "200": + application/json: {"status": "success", "data": {"next": "eyJwYWdlIjoxMiwibm90ZSI6InRoaXMgaXMganVzdCBhbiBleGFtcGxlIGFuZCBub3QgcmVwcmVzZW50YXRpdmUgZm9yIGEgcmVhbCBjdXJzb3IhIn0=", "results": [{"id": "H77fDF8uvEzGNPRubiz5DvQ7", "remote_id": "32", "candidate_id": "26vafvWSRmbhNcxJYqjCzuJg", "application_id": "H5daSm8e85Dmvmne3wLeCPhX", "interview_id": "5J7L4b48wBfffYwek9Az9pkM", "author_id": "6Wq4mDpYz3vBnh8Xk2Lr9TfA", "responses": [{"remote_id": null, "label": "Overall rating", "description": "How you feel the interview went", "required": false, "type": "SINGLE_SELECT", "options": [{"remote_id": "1", "label": "Definitely not"}, {"remote_id": "2", "label": "No"}, {"remote_id": "3", "label": "Mixed"}, {"remote_id": "4", "label": "Yes"}, {"remote_id": "5", "label": "Strong yes"}, {"remote_id": "6", "label": "No decision"}], "answer": {"remote_id": "4", "label": "Yes"}}, {"remote_id": null, "label": "Summary", "description": "Main notes about the interview", "required": true, "type": "TEXT", "answer": "Excellent system design, strong communication throughout."}, {"remote_id": "8123", "label": "System design", "description": null, "required": null, "type": "SINGLE_SELECT", "options": [{"remote_id": "1", "label": "Definitely not"}, {"remote_id": "2", "label": "No"}, {"remote_id": "3", "label": "Mixed"}, {"remote_id": "4", "label": "Yes"}, {"remote_id": "5", "label": "Strong yes"}, {"remote_id": "6", "label": "No decision"}], "answer": {"remote_id": "5", "label": "Strong yes"}}, {"remote_id": "4471", "label": "Would you work with this person again?", "description": null, "required": true, "type": "BOOLEAN", "answer": true}, {"remote_id": "4472", "label": "Which areas did you cover?", "description": null, "required": false, "type": "MULTI_SELECT", "options": [{"remote_id": "9001", "label": "System design"}, {"remote_id": "9002", "label": "Debugging"}, {"remote_id": "9003", "label": "Pair programming"}], "answer": [{"remote_id": "9001", "label": "System design"}, {"remote_id": "9002", "label": "Debugging"}]}, {"remote_id": "4473", "label": "Anything the next interviewer should probe?", "description": null, "required": false, "type": "TEXT", "answer": "Ask more about experience with microservices"}, {"remote_id": "4474", "label": "Years of relevant experience", "description": null, "required": false, "type": "NUMBER", "answer": 7.5}, {"remote_id": "4475", "label": "Earliest start date", "description": null, "required": false, "type": "DATE", "answer": "2026-09-01T00:00:00Z"}, {"remote_id": "4476", "label": "Additional notes", "description": null, "required": false, "type": "TEXT", "answer": null}], "remote_created_at": "2022-08-07T14:01:29.196Z", "remote_updated_at": "2022-08-07T14:01:29.196Z", "changed_at": "2022-08-07T14:01:29.196Z", "remote_deleted_at": null, "author": {"id": "26vafvWSRmbhNcxJYqjCzuJg", "remote_id": "32", "first_name": "John", "last_name": "Doe", "email": "john.doe@kombo.dev"}}]}} + default: + application/json: {"status": "error", "error": {"code": "ATS.JOB_CLOSED", "title": "", "message": "", "log_url": "https://miserly-lifestyle.biz"}} + example1: + parameters: + query: + page_size: 100 + include_deleted: false + ignore_unsupported_filters: false + header: + X-Integration-Id: "workday:HWUTwvyx2wLoSUHphiWVrp28" + responses: + "200": + application/json: {"status": "success", "data": {"next": "eyJwYWdlIjoxMiwibm90ZSI6InRoaXMgaXMganVzdCBhbiBleGFtcGxlIGFuZCBub3QgcmVwcmVzZW50YXRpdmUgZm9yIGEgcmVhbCBjdXJzb3IhIn0=", "results": [{"id": "H77fDF8uvEzGNPRubiz5DvQ7", "remote_id": "32", "candidate_id": "26vafvWSRmbhNcxJYqjCzuJg", "application_id": "H5daSm8e85Dmvmne3wLeCPhX", "interview_id": "5J7L4b48wBfffYwek9Az9pkM", "author_id": "6Wq4mDpYz3vBnh8Xk2Lr9TfA", "responses": [{"remote_id": null, "label": "Overall rating", "description": "How you feel the interview went", "required": false, "type": "SINGLE_SELECT", "options": [{"remote_id": "1", "label": "Definitely not"}, {"remote_id": "2", "label": "No"}, {"remote_id": "3", "label": "Mixed"}, {"remote_id": "4", "label": "Yes"}, {"remote_id": "5", "label": "Strong yes"}, {"remote_id": "6", "label": "No decision"}], "answer": {"remote_id": "4", "label": "Yes"}}, {"remote_id": null, "label": "Summary", "description": "Main notes about the interview", "required": true, "type": "TEXT", "answer": "Excellent system design, strong communication throughout."}, {"remote_id": "8123", "label": "System design", "description": null, "required": null, "type": "SINGLE_SELECT", "options": [{"remote_id": "1", "label": "Definitely not"}, {"remote_id": "2", "label": "No"}, {"remote_id": "3", "label": "Mixed"}, {"remote_id": "4", "label": "Yes"}, {"remote_id": "5", "label": "Strong yes"}, {"remote_id": "6", "label": "No decision"}], "answer": {"remote_id": "5", "label": "Strong yes"}}, {"remote_id": "4471", "label": "Would you work with this person again?", "description": null, "required": true, "type": "BOOLEAN", "answer": true}, {"remote_id": "4472", "label": "Which areas did you cover?", "description": null, "required": false, "type": "MULTI_SELECT", "options": [{"remote_id": "9001", "label": "System design"}, {"remote_id": "9002", "label": "Debugging"}, {"remote_id": "9003", "label": "Pair programming"}], "answer": [{"remote_id": "9001", "label": "System design"}, {"remote_id": "9002", "label": "Debugging"}]}, {"remote_id": "4473", "label": "Anything the next interviewer should probe?", "description": null, "required": false, "type": "TEXT", "answer": "Ask more about experience with microservices"}, {"remote_id": "4474", "label": "Years of relevant experience", "description": null, "required": false, "type": "NUMBER", "answer": 7.5}, {"remote_id": "4475", "label": "Earliest start date", "description": null, "required": false, "type": "DATE", "answer": "2026-09-01T00:00:00Z"}, {"remote_id": "4476", "label": "Additional notes", "description": null, "required": false, "type": "TEXT", "answer": null}], "remote_created_at": "2022-08-07T14:01:29.196Z", "remote_updated_at": "2022-08-07T14:01:29.196Z", "changed_at": "2022-08-07T14:01:29.196Z", "remote_deleted_at": null, "author": {"id": "26vafvWSRmbhNcxJYqjCzuJg", "remote_id": "32", "first_name": "John", "last_name": "Doe", "email": "john.doe@kombo.dev"}}]}} + Error Response: + parameters: + query: + page_size: 100 + include_deleted: false + ignore_unsupported_filters: false + header: + X-Integration-Id: "workday:HWUTwvyx2wLoSUHphiWVrp28" + responses: + default: + application/json: {"status": "error", "error": {"code": "INTEGRATION.MODEL_NOT_AVAILABLE", "title": "This data model isn't supported for the selected integration.", "message": "The \"employees\" model is not yet available for Greenhouse. Please reach out to Kombo if you need this functionality.", "log_url": "https://app.kombo.dev/my-prod/logs?interactionId=123456"}} + Minimal Error Response: + parameters: + query: + page_size: 100 + include_deleted: false + ignore_unsupported_filters: false + header: + X-Integration-Id: "workday:HWUTwvyx2wLoSUHphiWVrp28" + responses: + default: + application/json: {"status": "error", "error": {"code": null, "title": null, "message": "The message is always in the response.", "log_url": null}} examplesVersion: 1.0.2 -releaseNotes: "## Python SDK Changes:\n* `kombo.ats.get_notes()`: **Added**\n* `kombo.ats.get_ats_notes()`: **Removed** (Breaking ⚠️)\n* `kombo.hris.add_employee_document()`: `request.remote_fields` **Added**\n* `kombo.hris.get_absence_types()`: `response.data.results[].custom_fields` **Added**\n* `kombo.hris.get_time_off_balances()`: `response.data.results[].type.custom_fields` **Added**\n* `kombo.hris.get_absences()`: `response.data.results[].type.custom_fields` **Added**\n* `kombo.ats.add_application_result_link()`: \n * `request.remote_fields.talent360` **Added**\n* `kombo.ats.add_application_note()`: \n * `request.remote_fields.talent360` **Added**\n* `kombo.ats.add_candidate_result_link()`: \n * `request.remote_fields.talent360` **Added**\n* `kombo.connect.create_connection_link()`: \n * `request.integration_tool.enum(talent360)` **Added**\n" +releaseNotes: | + ## Python SDK Changes: + * `kombo.hris.get_hris_pay_runs()`: **Added** + * `kombo.hris.get_hris_payslips()`: **Added** + * `kombo.ats.get_ats_scorecards()`: **Added** + * `kombo.connect.create_connection_link()`: `request.integration_tool` **Changed** generatedFiles: - .gitattributes - .vscode/settings.json diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index f18c440..d3864fe 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -31,7 +31,7 @@ generation: generateNewTests: true skipResponseBodyAssertions: false python: - version: 1.3.7 + version: 1.4.0 additionalDependencies: dev: inline-snapshot: '>=0.13.0' @@ -67,6 +67,7 @@ python: flatteningOrder: parameters-first forwardCompatibleEnumsByDefault: false forwardCompatibleUnionsByDefault: "false" + httpClientLibrary: httpx imports: option: openapi paths: diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index c2cfe9e..f4d9256 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,9 +1,9 @@ -speakeasyVersion: 1.793.1 +speakeasyVersion: 1.796.4 sources: kombo-prepared-spec: sourceNamespace: kombo-api - sourceRevisionDigest: sha256:ed16b9f2a4cce00a53aa105d3ad3e2abe5c0818c57cbe6d87b8f9ca7045198f6 - sourceBlobDigest: sha256:72986e004c346d96cad1e129dd435a0f07a69373ee813252b4a406c6aedc6e78 + sourceRevisionDigest: sha256:76b128ffb667be232b323731fbe13171869263724b27dab27bc431d9b41f00a4 + sourceBlobDigest: sha256:ed1ee376082fd562b0607e271527a72c364c5baccec7be09f82c131322998cb7 tags: - latest - 1.0.0 @@ -11,10 +11,10 @@ targets: kombo-python: source: kombo-prepared-spec sourceNamespace: kombo-api - sourceRevisionDigest: sha256:ed16b9f2a4cce00a53aa105d3ad3e2abe5c0818c57cbe6d87b8f9ca7045198f6 - sourceBlobDigest: sha256:72986e004c346d96cad1e129dd435a0f07a69373ee813252b4a406c6aedc6e78 + sourceRevisionDigest: sha256:76b128ffb667be232b323731fbe13171869263724b27dab27bc431d9b41f00a4 + sourceBlobDigest: sha256:ed1ee376082fd562b0607e271527a72c364c5baccec7be09f82c131322998cb7 codeSamplesNamespace: kombo-api-python-code-samples - codeSamplesRevisionDigest: sha256:df5a9815a644867df150da2c67d45f45940dc40d132dbd2d76f4a1ab2dcac5a3 + codeSamplesRevisionDigest: sha256:115bbb50ffe7aa5c841d3d385678c8f326685288741f6e2df9e26a825390dbec workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/README-PYPI.md b/README-PYPI.md index 36be485..43eb3ec 100644 --- a/README-PYPI.md +++ b/README-PYPI.md @@ -202,6 +202,7 @@ with SDK( * [get_rejection_reasons](https://github.com/kombohq/python-sdk/blob/master/docs/sdks/ats/README.md#get_rejection_reasons) - Get rejection reasons * [get_interviews](https://github.com/kombohq/python-sdk/blob/master/docs/sdks/ats/README.md#get_interviews) - Get interviews * [get_notes](https://github.com/kombohq/python-sdk/blob/master/docs/sdks/ats/README.md#get_notes) - Get notes +* [get_ats_scorecards](https://github.com/kombohq/python-sdk/blob/master/docs/sdks/ats/README.md#get_ats_scorecards) - Get scorecards * [import_tracked_application](https://github.com/kombohq/python-sdk/blob/master/docs/sdks/ats/README.md#import_tracked_application) - Import tracked application ### [Connect](https://github.com/kombohq/python-sdk/blob/master/docs/sdks/connect/README.md) @@ -245,6 +246,8 @@ with SDK( * [get_performance_review_cycles](https://github.com/kombohq/python-sdk/blob/master/docs/sdks/hris/README.md#get_performance_review_cycles) - Get performance review cycles * [get_performance_reviews](https://github.com/kombohq/python-sdk/blob/master/docs/sdks/hris/README.md#get_performance_reviews) - Get performance reviews * [get_staffing_entities](https://github.com/kombohq/python-sdk/blob/master/docs/sdks/hris/README.md#get_staffing_entities) - Get staffing entities +* [get_hris_pay_runs](https://github.com/kombohq/python-sdk/blob/master/docs/sdks/hris/README.md#get_hris_pay_runs) - Pay Runs +* [get_hris_payslips](https://github.com/kombohq/python-sdk/blob/master/docs/sdks/hris/README.md#get_hris_payslips) - Payslips @@ -335,9 +338,9 @@ with Kombo( **Inherit from [`SDKError`](https://github.com/kombohq/python-sdk/blob/master/./src/kombo/errors/sdkerror.py)**: -* [`KomboAtsError`](https://github.com/kombohq/python-sdk/blob/master/./src/kombo/errors/komboatserror.py): The standard error response with the error codes for the ATS use case. Applicable to 29 of 62 methods.* -* [`KomboHrisError`](https://github.com/kombohq/python-sdk/blob/master/./src/kombo/errors/kombohriserror.py): The standard error response with the error codes for the HRIS use case. Applicable to 18 of 62 methods.* -* [`KomboGeneralError`](https://github.com/kombohq/python-sdk/blob/master/./src/kombo/errors/kombogeneralerror.py): The standard error response with just the platform error codes. Applicable to 15 of 62 methods.* +* [`KomboAtsError`](https://github.com/kombohq/python-sdk/blob/master/./src/kombo/errors/komboatserror.py): The standard error response with the error codes for the ATS use case. Applicable to 30 of 65 methods.* +* [`KomboHrisError`](https://github.com/kombohq/python-sdk/blob/master/./src/kombo/errors/kombohriserror.py): The standard error response with the error codes for the HRIS use case. Applicable to 20 of 65 methods.* +* [`KomboGeneralError`](https://github.com/kombohq/python-sdk/blob/master/./src/kombo/errors/kombogeneralerror.py): The standard error response with just the platform error codes. Applicable to 15 of 65 methods.* * [`ResponseValidationError`](https://github.com/kombohq/python-sdk/blob/master/./src/kombo/errors/responsevalidationerror.py): Type mismatch between the response data and the expected Pydantic model. Provides access to the Pydantic validation error via the `cause` attribute. @@ -466,6 +469,20 @@ class CustomClient(AsyncHttpClient): s = Kombo(async_client=CustomClient(httpx.AsyncClient())) ``` +### httpx2 (Pydantic's httpx fork) + +[httpx2](https://httpx2.pydantic.dev/) is Pydantic's maintained fork of `httpx`. To run this SDK on httpx2, call `alias_httpx()` at your program's entry point, before importing the SDK, so every `import httpx` — including the ones inside the SDK — resolves to `httpx2`: +```python +import httpx2 + +httpx2.alias_httpx() + +from kombo import Kombo + +s = Kombo() +``` + +An SDK can also be generated against httpx2 directly, so it depends on the fork instead of `httpx`, by setting `python.httpClientLibrary: httpx2` in `gen.yaml`. diff --git a/README.md b/README.md index 87da348..ac810ca 100644 --- a/README.md +++ b/README.md @@ -202,6 +202,7 @@ with SDK( * [get_rejection_reasons](docs/sdks/ats/README.md#get_rejection_reasons) - Get rejection reasons * [get_interviews](docs/sdks/ats/README.md#get_interviews) - Get interviews * [get_notes](docs/sdks/ats/README.md#get_notes) - Get notes +* [get_ats_scorecards](docs/sdks/ats/README.md#get_ats_scorecards) - Get scorecards * [import_tracked_application](docs/sdks/ats/README.md#import_tracked_application) - Import tracked application ### [Connect](docs/sdks/connect/README.md) @@ -245,6 +246,8 @@ with SDK( * [get_performance_review_cycles](docs/sdks/hris/README.md#get_performance_review_cycles) - Get performance review cycles * [get_performance_reviews](docs/sdks/hris/README.md#get_performance_reviews) - Get performance reviews * [get_staffing_entities](docs/sdks/hris/README.md#get_staffing_entities) - Get staffing entities +* [get_hris_pay_runs](docs/sdks/hris/README.md#get_hris_pay_runs) - Pay Runs +* [get_hris_payslips](docs/sdks/hris/README.md#get_hris_payslips) - Payslips @@ -335,9 +338,9 @@ with Kombo( **Inherit from [`SDKError`](./src/kombo/errors/sdkerror.py)**: -* [`KomboAtsError`](./src/kombo/errors/komboatserror.py): The standard error response with the error codes for the ATS use case. Applicable to 29 of 62 methods.* -* [`KomboHrisError`](./src/kombo/errors/kombohriserror.py): The standard error response with the error codes for the HRIS use case. Applicable to 18 of 62 methods.* -* [`KomboGeneralError`](./src/kombo/errors/kombogeneralerror.py): The standard error response with just the platform error codes. Applicable to 15 of 62 methods.* +* [`KomboAtsError`](./src/kombo/errors/komboatserror.py): The standard error response with the error codes for the ATS use case. Applicable to 30 of 65 methods.* +* [`KomboHrisError`](./src/kombo/errors/kombohriserror.py): The standard error response with the error codes for the HRIS use case. Applicable to 20 of 65 methods.* +* [`KomboGeneralError`](./src/kombo/errors/kombogeneralerror.py): The standard error response with just the platform error codes. Applicable to 15 of 65 methods.* * [`ResponseValidationError`](./src/kombo/errors/responsevalidationerror.py): Type mismatch between the response data and the expected Pydantic model. Provides access to the Pydantic validation error via the `cause` attribute. @@ -466,6 +469,20 @@ class CustomClient(AsyncHttpClient): s = Kombo(async_client=CustomClient(httpx.AsyncClient())) ``` +### httpx2 (Pydantic's httpx fork) + +[httpx2](https://httpx2.pydantic.dev/) is Pydantic's maintained fork of `httpx`. To run this SDK on httpx2, call `alias_httpx()` at your program's entry point, before importing the SDK, so every `import httpx` — including the ones inside the SDK — resolves to `httpx2`: +```python +import httpx2 + +httpx2.alias_httpx() + +from kombo import Kombo + +s = Kombo() +``` + +An SDK can also be generated against httpx2 directly, so it depends on the fork instead of `httpx`, by setting `python.httpClientLibrary: httpx2` in `gen.yaml`. diff --git a/RELEASES.md b/RELEASES.md index 6b84b5a..6668072 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -298,4 +298,14 @@ Based on: ### Generated - [python v1.3.7] . ### Releases -- [PyPI v1.3.7] https://pypi.org/project/kombo/1.3.7 - . \ No newline at end of file +- [PyPI v1.3.7] https://pypi.org/project/kombo/1.3.7 - . + +## 2026-09-04 00:31:15 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.796.4 (2.935.1) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.4.0] . +### Releases +- [PyPI v1.4.0] https://pypi.org/project/kombo/1.4.0 - . \ No newline at end of file diff --git a/docs/models/amount.md b/docs/models/amount.md new file mode 100644 index 0000000..bcaccc5 --- /dev/null +++ b/docs/models/amount.md @@ -0,0 +1,11 @@ +# Amount + +The amount of the line item. + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| `currency` | *str* | :heavy_check_mark: | The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in. | +| `value` | *float* | :heavy_check_mark: | The monetary value. | \ No newline at end of file diff --git a/docs/models/change.md b/docs/models/change.md new file mode 100644 index 0000000..afb051e --- /dev/null +++ b/docs/models/change.md @@ -0,0 +1,16 @@ +# Change + +Why this webhook was sent: the issue was raised or resolved. + +## Example Usage + +```python +from kombo.models import Change +value: Change = "raised" +``` + + +## Values + +- `"raised"` +- `"resolved"` diff --git a/docs/models/employee.md b/docs/models/employee.md new file mode 100644 index 0000000..db90d01 --- /dev/null +++ b/docs/models/employee.md @@ -0,0 +1,16 @@ +# Employee + +The employee that the payslip is for. + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `id` | *str* | :heavy_check_mark: | The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing. | +| `remote_id` | *str* | :heavy_check_mark: | The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key. | +| `first_name` | *Nullable[str]* | :heavy_check_mark: | The employee’s first name. | +| `last_name` | *Nullable[str]* | :heavy_check_mark: | The employee’s last name. | +| `display_full_name` | *Nullable[str]* | :heavy_check_mark: | The employee’s full name, including any middle names. Not all HR systems provide an explicit display name, so we recommend falling back to `first_name` and `last_name`. | +| `work_email` | *OptionalNullable[str]* | :heavy_minus_sign: | The employee’s work email address. If the email address is invalid, we will set this to `null`. | +| `remote_deleted_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear.

[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) | \ No newline at end of file diff --git a/docs/models/formatmultiselect.md b/docs/models/formatmultiselect.md index 9cda57b..ac8baa5 100644 --- a/docs/models/formatmultiselect.md +++ b/docs/models/formatmultiselect.md @@ -3,7 +3,7 @@ ## Fields -| Field | Type | Required | Description | -| -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | -| `options` | List[[models.Option2](../models/option2.md)] | :heavy_check_mark: | N/A | -| `type` | *Literal["MULTI_SELECT"]* | :heavy_check_mark: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | +| `options` | List[[models.GetAtsJobsPositiveResponseOption2](../models/getatsjobspositiveresponseoption2.md)] | :heavy_check_mark: | N/A | +| `type` | *Literal["MULTI_SELECT"]* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/formatsingleselect.md b/docs/models/formatsingleselect.md index 4891ee3..9ad4528 100644 --- a/docs/models/formatsingleselect.md +++ b/docs/models/formatsingleselect.md @@ -3,8 +3,8 @@ ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | -| `display_type` | [OptionalNullable[models.DisplayType3]](../models/displaytype3.md) | :heavy_minus_sign: | N/A | -| `options` | List[[models.Option1](../models/option1.md)] | :heavy_check_mark: | N/A | -| `type` | *Literal["SINGLE_SELECT"]* | :heavy_check_mark: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | +| `display_type` | [OptionalNullable[models.DisplayType3]](../models/displaytype3.md) | :heavy_minus_sign: | N/A | +| `options` | List[[models.GetAtsJobsPositiveResponseOption1](../models/getatsjobspositiveresponseoption1.md)] | :heavy_check_mark: | N/A | +| `type` | *Literal["SINGLE_SELECT"]* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/option1.md b/docs/models/getatsjobspositiveresponseoption1.md similarity index 98% rename from docs/models/option1.md rename to docs/models/getatsjobspositiveresponseoption1.md index b851354..812ff77 100644 --- a/docs/models/option1.md +++ b/docs/models/getatsjobspositiveresponseoption1.md @@ -1,4 +1,4 @@ -# Option1 +# GetAtsJobsPositiveResponseOption1 ## Fields diff --git a/docs/models/option2.md b/docs/models/getatsjobspositiveresponseoption2.md similarity index 98% rename from docs/models/option2.md rename to docs/models/getatsjobspositiveresponseoption2.md index 13a0548..caa9ff5 100644 --- a/docs/models/option2.md +++ b/docs/models/getatsjobspositiveresponseoption2.md @@ -1,4 +1,4 @@ -# Option2 +# GetAtsJobsPositiveResponseOption2 ## Fields diff --git a/docs/models/author.md b/docs/models/getatsnotespositiveresponseauthor.md similarity index 99% rename from docs/models/author.md rename to docs/models/getatsnotespositiveresponseauthor.md index 45b0e58..a4c8607 100644 --- a/docs/models/author.md +++ b/docs/models/getatsnotespositiveresponseauthor.md @@ -1,4 +1,4 @@ -# Author +# GetAtsNotesPositiveResponseAuthor ## Fields diff --git a/docs/models/getatsnotespositiveresponseresult.md b/docs/models/getatsnotespositiveresponseresult.md index 8de8e7e..ee813d3 100644 --- a/docs/models/getatsnotespositiveresponseresult.md +++ b/docs/models/getatsnotespositiveresponseresult.md @@ -17,4 +17,4 @@ | `remote_updated_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | A timestamp retrieved from the remote system, describing when the resource was last updated.

[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) | | | `changed_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The timestamp when this specific record was last modified. This field only updates when properties directly on this record change, NOT when related or nested models change. For filtering that considers nested data changes, use the `updated_after` parameter which will return records when either the record itself OR its related models have been updated.

[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) | | | `remote_deleted_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear.

[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) | | -| `author` | [Nullable[models.Author]](../models/author.md) | :heavy_check_mark: | N/A | {
"id": "26vafvWSRmbhNcxJYqjCzuJg",
"remote_id": "32",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@kombo.dev"
} | \ No newline at end of file +| `author` | [Nullable[models.GetAtsNotesPositiveResponseAuthor]](../models/getatsnotespositiveresponseauthor.md) | :heavy_check_mark: | N/A | {
"id": "26vafvWSRmbhNcxJYqjCzuJg",
"remote_id": "32",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@kombo.dev"
} | \ No newline at end of file diff --git a/docs/models/getatsscorecardsglobals.md b/docs/models/getatsscorecardsglobals.md new file mode 100644 index 0000000..4ef66a5 --- /dev/null +++ b/docs/models/getatsscorecardsglobals.md @@ -0,0 +1,8 @@ +# GetAtsScorecardsGlobals + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | +| `integration_id` | *Optional[str]* | :heavy_minus_sign: | ID of the integration you want to interact with. | workday:HWUTwvyx2wLoSUHphiWVrp28 | \ No newline at end of file diff --git a/docs/models/getatsscorecardspositiveresponse.md b/docs/models/getatsscorecardspositiveresponse.md new file mode 100644 index 0000000..aded5c2 --- /dev/null +++ b/docs/models/getatsscorecardspositiveresponse.md @@ -0,0 +1,9 @@ +# GetAtsScorecardsPositiveResponse + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `status` | *Literal["success"]* | :heavy_check_mark: | N/A | | +| `data` | [models.GetAtsScorecardsPositiveResponseData](../models/getatsscorecardspositiveresponsedata.md) | :heavy_check_mark: | N/A | {
"next": "eyJwYWdlIjoxMiwibm90ZSI6InRoaXMgaXMganVzdCBhbiBleGFtcGxlIGFuZCBub3QgcmVwcmVzZW50YXRpdmUgZm9yIGEgcmVhbCBjdXJzb3IhIn0=",
"results": [
{
"id": "H77fDF8uvEzGNPRubiz5DvQ7",
"remote_id": "32",
"candidate_id": "26vafvWSRmbhNcxJYqjCzuJg",
"application_id": "H5daSm8e85Dmvmne3wLeCPhX",
"interview_id": "5J7L4b48wBfffYwek9Az9pkM",
"author_id": "6Wq4mDpYz3vBnh8Xk2Lr9TfA",
"responses": [
{
"answer": {
"label": "Yes",
"remote_id": "4"
},
"description": "How you feel the interview went",
"label": "Overall rating",
"options": [
{
"label": "Definitely not",
"remote_id": "1"
},
{
"label": "No",
"remote_id": "2"
},
{
"label": "Mixed",
"remote_id": "3"
},
{
"label": "Yes",
"remote_id": "4"
},
{
"label": "Strong yes",
"remote_id": "5"
},
{
"label": "No decision",
"remote_id": "6"
}
],
"remote_id": null,
"required": false,
"type": "SINGLE_SELECT"
},
{
"answer": "Excellent system design, strong communication throughout.",
"description": "Main notes about the interview",
"label": "Summary",
"remote_id": null,
"required": true,
"type": "TEXT"
},
{
"answer": {
"label": "Strong yes",
"remote_id": "5"
},
"description": null,
"label": "System design",
"options": [
{
"label": "Definitely not",
"remote_id": "1"
},
{
"label": "No",
"remote_id": "2"
},
{
"label": "Mixed",
"remote_id": "3"
},
{
"label": "Yes",
"remote_id": "4"
},
{
"label": "Strong yes",
"remote_id": "5"
},
{
"label": "No decision",
"remote_id": "6"
}
],
"remote_id": "8123",
"required": null,
"type": "SINGLE_SELECT"
},
{
"answer": true,
"description": null,
"label": "Would you work with this person again?",
"remote_id": "4471",
"required": true,
"type": "BOOLEAN"
},
{
"answer": [
{
"label": "System design",
"remote_id": "9001"
},
{
"label": "Debugging",
"remote_id": "9002"
}
],
"description": null,
"label": "Which areas did you cover?",
"options": [
{
"label": "System design",
"remote_id": "9001"
},
{
"label": "Debugging",
"remote_id": "9002"
},
{
"label": "Pair programming",
"remote_id": "9003"
}
],
"remote_id": "4472",
"required": false,
"type": "MULTI_SELECT"
},
{
"answer": "Ask more about experience with microservices",
"description": null,
"label": "Anything the next interviewer should probe?",
"remote_id": "4473",
"required": false,
"type": "TEXT"
},
{
"answer": 7.5,
"description": null,
"label": "Years of relevant experience",
"remote_id": "4474",
"required": false,
"type": "NUMBER"
},
{
"answer": "2026-09-01T00:00:00Z",
"description": null,
"label": "Earliest start date",
"remote_id": "4475",
"required": false,
"type": "DATE"
},
{
"answer": null,
"description": null,
"label": "Additional notes",
"remote_id": "4476",
"required": false,
"type": "TEXT"
}
],
"remote_created_at": "2022-08-07T14:01:29.196Z",
"remote_updated_at": "2022-08-07T14:01:29.196Z",
"remote_data": null,
"changed_at": "2022-08-07T14:01:29.196Z",
"remote_deleted_at": null,
"author": {
"id": "26vafvWSRmbhNcxJYqjCzuJg",
"remote_id": "32",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@kombo.dev"
}
}
]
} | \ No newline at end of file diff --git a/docs/models/getatsscorecardspositiveresponseanswer1.md b/docs/models/getatsscorecardspositiveresponseanswer1.md new file mode 100644 index 0000000..975c06a --- /dev/null +++ b/docs/models/getatsscorecardspositiveresponseanswer1.md @@ -0,0 +1,11 @@ +# GetAtsScorecardsPositiveResponseAnswer1 + +The id and label of the selected option. + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `remote_id` | *Nullable[str]* | :heavy_check_mark: | The ID of this option in the remote system, e.g. `strong_hire`. `null` when the system identifies the option only by its label. | +| `label` | *str* | :heavy_check_mark: | The option as the interviewer sees it, e.g. "Strong Hire". | \ No newline at end of file diff --git a/docs/models/getatsscorecardspositiveresponseanswer2.md b/docs/models/getatsscorecardspositiveresponseanswer2.md new file mode 100644 index 0000000..55bbaac --- /dev/null +++ b/docs/models/getatsscorecardspositiveresponseanswer2.md @@ -0,0 +1,9 @@ +# GetAtsScorecardsPositiveResponseAnswer2 + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `remote_id` | *Nullable[str]* | :heavy_check_mark: | The ID of this option in the remote system, e.g. `strong_hire`. `null` when the system identifies the option only by its label. | +| `label` | *str* | :heavy_check_mark: | The option as the interviewer sees it, e.g. "Strong Hire". | \ No newline at end of file diff --git a/docs/models/getatsscorecardspositiveresponseauthor.md b/docs/models/getatsscorecardspositiveresponseauthor.md new file mode 100644 index 0000000..0e611a5 --- /dev/null +++ b/docs/models/getatsscorecardspositiveresponseauthor.md @@ -0,0 +1,12 @@ +# GetAtsScorecardsPositiveResponseAuthor + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `id` | *str* | :heavy_check_mark: | The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing. | +| `remote_id` | *Nullable[str]* | :heavy_check_mark: | The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key. | +| `first_name` | *Nullable[str]* | :heavy_check_mark: | First name of the user. | +| `last_name` | *Nullable[str]* | :heavy_check_mark: | Last name of the user. | +| `email` | *OptionalNullable[str]* | :heavy_minus_sign: | Email of the user. If the email address is invalid, it will be set to null. | \ No newline at end of file diff --git a/docs/models/getatsscorecardspositiveresponsedata.md b/docs/models/getatsscorecardspositiveresponsedata.md new file mode 100644 index 0000000..0200f78 --- /dev/null +++ b/docs/models/getatsscorecardspositiveresponsedata.md @@ -0,0 +1,9 @@ +# GetAtsScorecardsPositiveResponseData + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `next` | *Nullable[str]* | :heavy_check_mark: | Cursor string that can be passed to the `cursor` query parameter to get the next page. If this is `null`, then there are no more pages. | +| `results` | List[[models.GetAtsScorecardsPositiveResponseResult](../models/getatsscorecardspositiveresponseresult.md)] | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/getatsscorecardspositiveresponseoption1.md b/docs/models/getatsscorecardspositiveresponseoption1.md new file mode 100644 index 0000000..48bb72d --- /dev/null +++ b/docs/models/getatsscorecardspositiveresponseoption1.md @@ -0,0 +1,9 @@ +# GetAtsScorecardsPositiveResponseOption1 + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `remote_id` | *Nullable[str]* | :heavy_check_mark: | The ID of this option in the remote system, e.g. `strong_hire`. `null` when the system identifies the option only by its label. | +| `label` | *str* | :heavy_check_mark: | The option as the interviewer sees it, e.g. "Strong Hire". | \ No newline at end of file diff --git a/docs/models/getatsscorecardspositiveresponseoption2.md b/docs/models/getatsscorecardspositiveresponseoption2.md new file mode 100644 index 0000000..180ab05 --- /dev/null +++ b/docs/models/getatsscorecardspositiveresponseoption2.md @@ -0,0 +1,9 @@ +# GetAtsScorecardsPositiveResponseOption2 + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `remote_id` | *Nullable[str]* | :heavy_check_mark: | The ID of this option in the remote system, e.g. `strong_hire`. `null` when the system identifies the option only by its label. | +| `label` | *str* | :heavy_check_mark: | The option as the interviewer sees it, e.g. "Strong Hire". | \ No newline at end of file diff --git a/docs/models/getatsscorecardspositiveresponseresult.md b/docs/models/getatsscorecardspositiveresponseresult.md new file mode 100644 index 0000000..4b5b9db --- /dev/null +++ b/docs/models/getatsscorecardspositiveresponseresult.md @@ -0,0 +1,19 @@ +# GetAtsScorecardsPositiveResponseResult + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `id` | *str* | :heavy_check_mark: | The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing. | | +| `remote_id` | *str* | :heavy_check_mark: | The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key. | | +| `candidate_id` | *Nullable[str]* | :heavy_check_mark: | The Kombo ID of the candidate this scorecard evaluates. | | +| `application_id` | *Nullable[str]* | :heavy_check_mark: | The Kombo ID of the application this scorecard belongs to. | | +| `interview_id` | *Nullable[str]* | :heavy_check_mark: | The Kombo ID of the interview this scorecard was submitted against. | | +| `author_id` | *Nullable[str]* | :heavy_check_mark: | The Kombo ID of the user this evaluation belongs to. Where the ATS distinguishes who submitted the scorecard from whose review it is, this is the source of the opinion (the user whose evaluation it is, not whoever entered it). The ID can be used to retrieve the user from the `get users` endpoint. | | +| `responses` | List[[models.Response](../models/response.md)] | :heavy_minus_sign: | Every question on the scorecard, together with its definition and the answer submitted by the interviewer. | | +| `remote_created_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The date and time the object was created in the remote system.

[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) | | +| `remote_updated_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | A timestamp retrieved from the remote system, describing when the resource was last updated.

[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) | | +| `changed_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The timestamp when this specific record was last modified. This field only updates when properties directly on this record change, NOT when related or nested models change. For filtering that considers nested data changes, use the `updated_after` parameter which will return records when either the record itself OR its related models have been updated.

[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) | | +| `remote_deleted_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear.

[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) | | +| `author` | [Nullable[models.GetAtsScorecardsPositiveResponseAuthor]](../models/getatsscorecardspositiveresponseauthor.md) | :heavy_check_mark: | N/A | {
"id": "26vafvWSRmbhNcxJYqjCzuJg",
"remote_id": "32",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@kombo.dev"
} | \ No newline at end of file diff --git a/docs/models/getatsscorecardsrequest.md b/docs/models/getatsscorecardsrequest.md new file mode 100644 index 0000000..d63c847 --- /dev/null +++ b/docs/models/getatsscorecardsrequest.md @@ -0,0 +1,16 @@ +# GetAtsScorecardsRequest + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `cursor` | *Optional[str]* | :heavy_minus_sign: | An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response. | +| `page_size` | *Optional[int]* | :heavy_minus_sign: | The number of results to return per page. Maximum is 250. | +| `updated_after` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged.

If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden.

For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior).

For this endpoint, `updated_after` matches when the returned record changed, or when related data changed as described below.

\| Path \| Added/Removed \| Linked Record \|
\| --- \| --- \| --- \|
\| `author` \| ✗ No \| ✗ No \|
\| `application` \| ✗ No \| ✗ No \|
\| `candidate` \| ✗ No \| ✗ No \|
\| `interview` \| ✗ No \| ✗ No \|

_**Added/Removed**: Whether adding or removing entries from this list triggers an update (n/a for single records). **Linked Record**: Whether changes to the linked record itself trigger an update._ | +| `include_deleted` | *Optional[bool]* | :heavy_minus_sign: | By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too. | +| `ignore_unsupported_filters` | *Optional[bool]* | :heavy_minus_sign: | When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. | +| `ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`. | +| `remote_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of remote IDs. | +| `candidate_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of candidate IDs. Prefer filtering by `candidate_ids` when you want to download the full interview feedback available for a candidate, across all their applications. | +| `application_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of application IDs. We will only return scorecards that belong to _any_ of these applications. | \ No newline at end of file diff --git a/docs/models/getatsscorecardsresponse.md b/docs/models/getatsscorecardsresponse.md new file mode 100644 index 0000000..756daff --- /dev/null +++ b/docs/models/getatsscorecardsresponse.md @@ -0,0 +1,8 @@ +# GetAtsScorecardsResponse + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | +| `result` | [models.GetAtsScorecardsPositiveResponse](../models/getatsscorecardspositiveresponse.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/gethrispayrunsglobals.md b/docs/models/gethrispayrunsglobals.md new file mode 100644 index 0000000..75fd95c --- /dev/null +++ b/docs/models/gethrispayrunsglobals.md @@ -0,0 +1,8 @@ +# GetHrisPayRunsGlobals + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | +| `integration_id` | *Optional[str]* | :heavy_minus_sign: | ID of the integration you want to interact with. | workday:HWUTwvyx2wLoSUHphiWVrp28 | \ No newline at end of file diff --git a/docs/models/gethrispayrunspositiveresponse.md b/docs/models/gethrispayrunspositiveresponse.md new file mode 100644 index 0000000..1ab9b12 --- /dev/null +++ b/docs/models/gethrispayrunspositiveresponse.md @@ -0,0 +1,9 @@ +# GetHrisPayRunsPositiveResponse + + +## Fields + +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `status` | *Literal["success"]* | :heavy_check_mark: | N/A | | +| `data` | [models.GetHrisPayRunsPositiveResponseData](../models/gethrispayrunspositiveresponsedata.md) | :heavy_check_mark: | N/A | {
"next": "eyJwYWdlIjoxMiwibm90ZSI6InRoaXMgaXMganVzdCBhbiBleGFtcGxlIGFuZCBub3QgcmVwcmVzZW50YXRpdmUgZm9yIGEgcmVhbCBjdXJzb3IhIn0=",
"results": [
{
"id": "HdyE3KNfcbNzXFRqwW1Wh2eP",
"remote_id": "300000092871122",
"start_date": "2026-01-01T00:00:00Z",
"end_date": "2026-01-13T00:00:00Z",
"legal_entity_id": "3Y6vdh2SPujGVx8oj4g8hdUu",
"changed_at": "2026-01-10T12:32:01Z",
"remote_deleted_at": null,
"remote_data": null,
"totals": {
"gross_pay": {
"currency": "USD",
"value": 435300
},
"net_pay": {
"currency": "USD",
"value": 362300
},
"paid_amount": {
"currency": "USD",
"value": 306300.26
}
}
}
]
} | \ No newline at end of file diff --git a/docs/models/gethrispayrunspositiveresponsedata.md b/docs/models/gethrispayrunspositiveresponsedata.md new file mode 100644 index 0000000..454a5a6 --- /dev/null +++ b/docs/models/gethrispayrunspositiveresponsedata.md @@ -0,0 +1,9 @@ +# GetHrisPayRunsPositiveResponseData + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `next` | *Nullable[str]* | :heavy_check_mark: | Cursor string that can be passed to the `cursor` query parameter to get the next page. If this is `null`, then there are no more pages. | +| `results` | List[[models.GetHrisPayRunsPositiveResponseResult](../models/gethrispayrunspositiveresponseresult.md)] | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/gethrispayrunspositiveresponsegrosspay.md b/docs/models/gethrispayrunspositiveresponsegrosspay.md new file mode 100644 index 0000000..5c99614 --- /dev/null +++ b/docs/models/gethrispayrunspositiveresponsegrosspay.md @@ -0,0 +1,11 @@ +# GetHrisPayRunsPositiveResponseGrossPay + +The total gross pay for the pay run, before taxes and after gross deductions. + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| `currency` | *str* | :heavy_check_mark: | The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in. | +| `value` | *float* | :heavy_check_mark: | The monetary value. | \ No newline at end of file diff --git a/docs/models/gethrispayrunspositiveresponsenetpay.md b/docs/models/gethrispayrunspositiveresponsenetpay.md new file mode 100644 index 0000000..b4d922c --- /dev/null +++ b/docs/models/gethrispayrunspositiveresponsenetpay.md @@ -0,0 +1,11 @@ +# GetHrisPayRunsPositiveResponseNetPay + +The total net pay for the pay run, after taxes have been applied to the gross pay. + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| `currency` | *str* | :heavy_check_mark: | The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in. | +| `value` | *float* | :heavy_check_mark: | The monetary value. | \ No newline at end of file diff --git a/docs/models/gethrispayrunspositiveresponsepaidamount.md b/docs/models/gethrispayrunspositiveresponsepaidamount.md new file mode 100644 index 0000000..dc06cda --- /dev/null +++ b/docs/models/gethrispayrunspositiveresponsepaidamount.md @@ -0,0 +1,11 @@ +# GetHrisPayRunsPositiveResponsePaidAmount + +The total amount paid out through the pay run. This value accounts for net earnings and deductions. + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| `currency` | *str* | :heavy_check_mark: | The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in. | +| `value` | *float* | :heavy_check_mark: | The monetary value. | \ No newline at end of file diff --git a/docs/models/gethrispayrunspositiveresponseresult.md b/docs/models/gethrispayrunspositiveresponseresult.md new file mode 100644 index 0000000..3fbc340 --- /dev/null +++ b/docs/models/gethrispayrunspositiveresponseresult.md @@ -0,0 +1,15 @@ +# GetHrisPayRunsPositiveResponseResult + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `id` | *str* | :heavy_check_mark: | The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing. | | +| `remote_id` | *str* | :heavy_check_mark: | The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key. | | +| `start_date` | [datetime](https://docs.python.org/3/library/datetime.html#datetime-objects) | :heavy_check_mark: | The start date of the pay run, as a calendar date (`yyyy-MM-dd`). | | +| `end_date` | [datetime](https://docs.python.org/3/library/datetime.html#datetime-objects) | :heavy_check_mark: | The end date of the pay run, as a calendar date (`yyyy-MM-dd`). | | +| `legal_entity_id` | *Nullable[str]* | :heavy_check_mark: | The Kombo ID of the pay run’s legal entity. The ID can be used to retrieve the legal entity from the `get legal entities` endpoint. | | +| `changed_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The timestamp when this specific record was last modified. This field only updates when properties directly on this record change, NOT when related or nested models change. For filtering that considers nested data changes, use the `updated_after` parameter which will return records when either the record itself OR its related models have been updated.

[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) | | +| `remote_deleted_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear.

[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) | | +| `totals` | [models.GetHrisPayRunsPositiveResponseTotals](../models/gethrispayrunspositiveresponsetotals.md) | :heavy_check_mark: | N/A | {
"gross_pay": {
"currency": "USD",
"value": 435300
},
"net_pay": {
"currency": "USD",
"value": 362300
},
"paid_amount": {
"currency": "USD",
"value": 306300.26
}
} | \ No newline at end of file diff --git a/docs/models/gethrispayrunspositiveresponsetotals.md b/docs/models/gethrispayrunspositiveresponsetotals.md new file mode 100644 index 0000000..2ca1d88 --- /dev/null +++ b/docs/models/gethrispayrunspositiveresponsetotals.md @@ -0,0 +1,10 @@ +# GetHrisPayRunsPositiveResponseTotals + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | +| `gross_pay` | [OptionalNullable[models.GetHrisPayRunsPositiveResponseGrossPay]](../models/gethrispayrunspositiveresponsegrosspay.md) | :heavy_minus_sign: | The total gross pay for the pay run, before taxes and after gross deductions. | +| `net_pay` | [OptionalNullable[models.GetHrisPayRunsPositiveResponseNetPay]](../models/gethrispayrunspositiveresponsenetpay.md) | :heavy_minus_sign: | The total net pay for the pay run, after taxes have been applied to the gross pay. | +| `paid_amount` | [OptionalNullable[models.GetHrisPayRunsPositiveResponsePaidAmount]](../models/gethrispayrunspositiveresponsepaidamount.md) | :heavy_minus_sign: | The total amount paid out through the pay run. This value accounts for net earnings and deductions. | \ No newline at end of file diff --git a/docs/models/gethrispayrunsrequest.md b/docs/models/gethrispayrunsrequest.md new file mode 100644 index 0000000..5bd6649 --- /dev/null +++ b/docs/models/gethrispayrunsrequest.md @@ -0,0 +1,15 @@ +# GetHrisPayRunsRequest + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `cursor` | *Optional[str]* | :heavy_minus_sign: | An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response. | +| `page_size` | *Optional[int]* | :heavy_minus_sign: | The number of results to return per page. Maximum is 250. | +| `updated_after` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged.

If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden.

For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior).

For this endpoint, only changes to the returned record itself are considered. | +| `include_deleted` | *Optional[bool]* | :heavy_minus_sign: | By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too. | +| `ignore_unsupported_filters` | *Optional[bool]* | :heavy_minus_sign: | When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. | +| `ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`. | +| `remote_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of remote IDs. | +| `legal_entity_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of legal entity IDs. | \ No newline at end of file diff --git a/docs/models/gethrispayrunsresponse.md b/docs/models/gethrispayrunsresponse.md new file mode 100644 index 0000000..3a68723 --- /dev/null +++ b/docs/models/gethrispayrunsresponse.md @@ -0,0 +1,8 @@ +# GetHrisPayRunsResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | +| `result` | [models.GetHrisPayRunsPositiveResponse](../models/gethrispayrunspositiveresponse.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/gethrispayslipsglobals.md b/docs/models/gethrispayslipsglobals.md new file mode 100644 index 0000000..d22ea12 --- /dev/null +++ b/docs/models/gethrispayslipsglobals.md @@ -0,0 +1,8 @@ +# GetHrisPayslipsGlobals + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | +| `integration_id` | *Optional[str]* | :heavy_minus_sign: | ID of the integration you want to interact with. | workday:HWUTwvyx2wLoSUHphiWVrp28 | \ No newline at end of file diff --git a/docs/models/gethrispayslipspositiveresponse.md b/docs/models/gethrispayslipspositiveresponse.md new file mode 100644 index 0000000..94601e3 --- /dev/null +++ b/docs/models/gethrispayslipspositiveresponse.md @@ -0,0 +1,9 @@ +# GetHrisPayslipsPositiveResponse + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `status` | *Literal["success"]* | :heavy_check_mark: | N/A | | +| `data` | [models.GetHrisPayslipsPositiveResponseData](../models/gethrispayslipspositiveresponsedata.md) | :heavy_check_mark: | N/A | {
"next": "eyJwYWdlIjoxMiwibm90ZSI6InRoaXMgaXMganVzdCBhbiBleGFtcGxlIGFuZCBub3QgcmVwcmVzZW50YXRpdmUgZm9yIGEgcmVhbCBjdXJzb3IhIn0=",
"results": [
{
"id": "E4q8YceHEtPWeGwBAEcd9xPs",
"remote_id": "300000331094861",
"changed_at": "2026-01-10T12:32:01Z",
"remote_deleted_at": null,
"remote_data": null,
"totals": {
"gross_pay": {
"currency": "USD",
"value": 2207.75
},
"net_pay": {
"currency": "USD",
"value": 1730.35
},
"paid_amount": {
"currency": "USD",
"value": 1730.35
}
},
"employee": {
"id": "26vafvWSRmbhNcxJYqjCzuJg",
"remote_id": "32",
"first_name": "John",
"last_name": "Doe",
"display_full_name": "John Doe",
"work_email": "john.doe@acme.com",
"remote_deleted_at": null
},
"pay_run": {
"id": "HdyE3KNfcbNzXFRqwW1Wh2eP",
"remote_id": "300000092871122",
"start_date": "2026-01-01T00:00:00Z",
"end_date": "2026-01-13T00:00:00Z",
"legal_entity_id": "3Y6vdh2SPujGVx8oj4g8hdUu"
},
"line_items": [
{
"id": "8TMenmF8QVyP1EqagstHhsPG",
"remote_id": "300000331094861:REGULAR_SALARY",
"name": "Regular Salary",
"amount": {
"currency": "USD",
"value": 2207.75
}
},
{
"id": "CELfyfzuHs6Dz1MDPdoSCY3U",
"remote_id": "300000331094861:FIT_WITHHELD",
"name": "FIT Withheld",
"amount": {
"currency": "USD",
"value": 235.94
}
},
{
"id": "H1gPqyuZTK3y75NRxe4QZ3u7",
"remote_id": "300000331094861:SOCIAL_SECURITY_EMPLOYEE_WITHHELD",
"name": "Social Security Employee Withheld",
"amount": {
"currency": "USD",
"value": 136.88
}
},
{
"id": "HEnJXik92Qqph5SX4NtK6NRM",
"remote_id": "300000331094861:MEDICARE_EMPLOYEE_WITHHELD",
"name": "Medicare Employee Withheld",
"amount": {
"currency": "USD",
"value": 32.01
}
},
{
"id": "Ho16emGY5zVYeEc2nN9CWeKv",
"remote_id": "300000331094861:SIT_WITHHELD_CA",
"name": "SIT Withheld (CA)",
"amount": {
"currency": "USD",
"value": 71.47
}
},
{
"id": "9D24qXFEp1pSQ2Y3jaRFSTBQ",
"remote_id": "300000331094861:VPDI_EMPLOYEE_WITHHELD_CA",
"name": "VPDI Employee Withheld (CA)",
"amount": {
"currency": "USD",
"value": 1.1
}
}
]
}
]
} | \ No newline at end of file diff --git a/docs/models/gethrispayslipspositiveresponsedata.md b/docs/models/gethrispayslipspositiveresponsedata.md new file mode 100644 index 0000000..536494b --- /dev/null +++ b/docs/models/gethrispayslipspositiveresponsedata.md @@ -0,0 +1,9 @@ +# GetHrisPayslipsPositiveResponseData + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `next` | *Nullable[str]* | :heavy_check_mark: | Cursor string that can be passed to the `cursor` query parameter to get the next page. If this is `null`, then there are no more pages. | +| `results` | List[[models.GetHrisPayslipsPositiveResponseResult](../models/gethrispayslipspositiveresponseresult.md)] | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/gethrispayslipspositiveresponsegrosspay.md b/docs/models/gethrispayslipspositiveresponsegrosspay.md new file mode 100644 index 0000000..968a449 --- /dev/null +++ b/docs/models/gethrispayslipspositiveresponsegrosspay.md @@ -0,0 +1,11 @@ +# GetHrisPayslipsPositiveResponseGrossPay + +The total gross pay for the payslip, before taxes and after gross deductions. + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| `currency` | *str* | :heavy_check_mark: | The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in. | +| `value` | *float* | :heavy_check_mark: | The monetary value. | \ No newline at end of file diff --git a/docs/models/gethrispayslipspositiveresponsenetpay.md b/docs/models/gethrispayslipspositiveresponsenetpay.md new file mode 100644 index 0000000..9a710a7 --- /dev/null +++ b/docs/models/gethrispayslipspositiveresponsenetpay.md @@ -0,0 +1,11 @@ +# GetHrisPayslipsPositiveResponseNetPay + +The total net pay for the payslip, after taxes have been applied to the gross pay. + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| `currency` | *str* | :heavy_check_mark: | The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in. | +| `value` | *float* | :heavy_check_mark: | The monetary value. | \ No newline at end of file diff --git a/docs/models/gethrispayslipspositiveresponsepaidamount.md b/docs/models/gethrispayslipspositiveresponsepaidamount.md new file mode 100644 index 0000000..894c5d1 --- /dev/null +++ b/docs/models/gethrispayslipspositiveresponsepaidamount.md @@ -0,0 +1,11 @@ +# GetHrisPayslipsPositiveResponsePaidAmount + +The amount of the payslip that was actually paid out to the employee. This value accounts for net earnings and deductions. + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| `currency` | *str* | :heavy_check_mark: | The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in. | +| `value` | *float* | :heavy_check_mark: | The monetary value. | \ No newline at end of file diff --git a/docs/models/gethrispayslipspositiveresponseresult.md b/docs/models/gethrispayslipspositiveresponseresult.md new file mode 100644 index 0000000..5d38025 --- /dev/null +++ b/docs/models/gethrispayslipspositiveresponseresult.md @@ -0,0 +1,15 @@ +# GetHrisPayslipsPositiveResponseResult + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `id` | *str* | :heavy_check_mark: | The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing. | | +| `remote_id` | *str* | :heavy_check_mark: | The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key. | | +| `changed_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The timestamp when this specific record was last modified. This field only updates when properties directly on this record change, NOT when related or nested models change. For filtering that considers nested data changes, use the `updated_after` parameter which will return records when either the record itself OR its related models have been updated.

[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) | | +| `remote_deleted_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear.

[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) | | +| `totals` | [models.GetHrisPayslipsPositiveResponseTotals](../models/gethrispayslipspositiveresponsetotals.md) | :heavy_check_mark: | N/A | {
"gross_pay": {
"currency": "USD",
"value": 2207.75
},
"net_pay": {
"currency": "USD",
"value": 1730.35
},
"paid_amount": {
"currency": "USD",
"value": 1730.35
}
} | +| `employee` | [models.Employee](../models/employee.md) | :heavy_check_mark: | The employee that the payslip is for. | {
"id": "26vafvWSRmbhNcxJYqjCzuJg",
"remote_id": "32",
"first_name": "John",
"last_name": "Doe",
"display_full_name": "John Doe",
"work_email": "john.doe@acme.com",
"remote_deleted_at": null
} | +| `pay_run` | [Nullable[models.PayRun]](../models/payrun.md) | :heavy_check_mark: | The pay run the payslip was paid out through. | {
"id": "HdyE3KNfcbNzXFRqwW1Wh2eP",
"remote_id": "300000092871122",
"start_date": "2026-01-01T00:00:00Z",
"end_date": "2026-01-13T00:00:00Z",
"legal_entity_id": "3Y6vdh2SPujGVx8oj4g8hdUu"
} | +| `line_items` | List[[models.LineItem](../models/lineitem.md)] | :heavy_check_mark: | The individual earnings, deductions, and contributions that make up the payslip. | [
{
"id": "8TMenmF8QVyP1EqagstHhsPG",
"remote_id": "300000331094861:REGULAR_SALARY",
"name": "Regular Salary",
"amount": {
"currency": "USD",
"value": 2207.75
}
},
{
"id": "CELfyfzuHs6Dz1MDPdoSCY3U",
"remote_id": "300000331094861:FIT_WITHHELD",
"name": "FIT Withheld",
"amount": {
"currency": "USD",
"value": 235.94
}
},
{
"id": "H1gPqyuZTK3y75NRxe4QZ3u7",
"remote_id": "300000331094861:SOCIAL_SECURITY_EMPLOYEE_WITHHELD",
"name": "Social Security Employee Withheld",
"amount": {
"currency": "USD",
"value": 136.88
}
},
{
"id": "HEnJXik92Qqph5SX4NtK6NRM",
"remote_id": "300000331094861:MEDICARE_EMPLOYEE_WITHHELD",
"name": "Medicare Employee Withheld",
"amount": {
"currency": "USD",
"value": 32.01
}
},
{
"id": "Ho16emGY5zVYeEc2nN9CWeKv",
"remote_id": "300000331094861:SIT_WITHHELD_CA",
"name": "SIT Withheld (CA)",
"amount": {
"currency": "USD",
"value": 71.47
}
},
{
"id": "9D24qXFEp1pSQ2Y3jaRFSTBQ",
"remote_id": "300000331094861:VPDI_EMPLOYEE_WITHHELD_CA",
"name": "VPDI Employee Withheld (CA)",
"amount": {
"currency": "USD",
"value": 1.1
}
}
] | \ No newline at end of file diff --git a/docs/models/gethrispayslipspositiveresponsetotals.md b/docs/models/gethrispayslipspositiveresponsetotals.md new file mode 100644 index 0000000..8f4ba89 --- /dev/null +++ b/docs/models/gethrispayslipspositiveresponsetotals.md @@ -0,0 +1,10 @@ +# GetHrisPayslipsPositiveResponseTotals + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `gross_pay` | [OptionalNullable[models.GetHrisPayslipsPositiveResponseGrossPay]](../models/gethrispayslipspositiveresponsegrosspay.md) | :heavy_minus_sign: | The total gross pay for the payslip, before taxes and after gross deductions. | +| `net_pay` | [OptionalNullable[models.GetHrisPayslipsPositiveResponseNetPay]](../models/gethrispayslipspositiveresponsenetpay.md) | :heavy_minus_sign: | The total net pay for the payslip, after taxes have been applied to the gross pay. | +| `paid_amount` | [OptionalNullable[models.GetHrisPayslipsPositiveResponsePaidAmount]](../models/gethrispayslipspositiveresponsepaidamount.md) | :heavy_minus_sign: | The amount of the payslip that was actually paid out to the employee. This value accounts for net earnings and deductions. | \ No newline at end of file diff --git a/docs/models/gethrispayslipsrequest.md b/docs/models/gethrispayslipsrequest.md new file mode 100644 index 0000000..1c23846 --- /dev/null +++ b/docs/models/gethrispayslipsrequest.md @@ -0,0 +1,17 @@ +# GetHrisPayslipsRequest + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `cursor` | *Optional[str]* | :heavy_minus_sign: | An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response. | +| `page_size` | *Optional[int]* | :heavy_minus_sign: | The number of results to return per page. Maximum is 250. | +| `updated_after` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged.

If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden.

For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior).

For this endpoint, `updated_after` matches when the returned record changed, or when related data changed as described below.

\| Path \| Added/Removed \| Linked Record \|
\| --- \| --- \| --- \|
\| `employee` \| ✗ No \| ✗ No \|
\| `pay_run` \| ✗ No \| ✗ No \|
\| `line_items` \| ✓ Yes \| ✓ Yes \|
\| `line_items` → `salary_type` \| ✗ No \| ✗ No \|

_**Added/Removed**: Whether adding or removing entries from this list triggers an update (n/a for single records). **Linked Record**: Whether changes to the linked record itself trigger an update._ | +| `include_deleted` | *Optional[bool]* | :heavy_minus_sign: | By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too. | +| `ignore_unsupported_filters` | *Optional[bool]* | :heavy_minus_sign: | When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. | +| `ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`. | +| `remote_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of remote IDs. | +| `legal_entity_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of legal entity IDs. | +| `employee_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of employee IDs. | +| `payrun_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of payrun IDs. | \ No newline at end of file diff --git a/docs/models/gethrispayslipsresponse.md b/docs/models/gethrispayslipsresponse.md new file mode 100644 index 0000000..035518d --- /dev/null +++ b/docs/models/gethrispayslipsresponse.md @@ -0,0 +1,8 @@ +# GetHrisPayslipsResponse + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | +| `result` | [models.GetHrisPayslipsPositiveResponse](../models/gethrispayslipspositiveresponse.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/integration.md b/docs/models/integration.md new file mode 100644 index 0000000..e39a44d --- /dev/null +++ b/docs/models/integration.md @@ -0,0 +1,13 @@ +# Integration + +The integration this issue belongs to. `null` for environment-wide issues. + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | +| `id` | *str* | :heavy_check_mark: | The unique identifier of the integration. | +| `tool` | *str* | :heavy_check_mark: | The name of the integrated tool (e.g., "personio", "greenhouse"). | +| `category` | [models.IssueStatusChangedWebhookPayloadCategory](../models/issuestatuschangedwebhookpayloadcategory.md) | :heavy_check_mark: | The category of the integration (HRIS, ATS, ASSESSMENT, or LMS). | +| `end_user` | [models.IssueStatusChangedWebhookPayloadEndUser](../models/issuestatuschangedwebhookpayloadenduser.md) | :heavy_check_mark: | Information about the end user who created the integration. | \ No newline at end of file diff --git a/docs/models/integrationtool.md b/docs/models/integrationtool.md index 5239d66..bd35e33 100644 --- a/docs/models/integrationtool.md +++ b/docs/models/integrationtool.md @@ -22,6 +22,7 @@ value: IntegrationTool = "workday" - `"cornerstonetalentlink"` - `"recruitee"` - `"recruiterflow"` +- `"atlas"` - `"greenhouse"` - `"greenhousev3"` - `"greenhousejobboard"` @@ -129,6 +130,7 @@ value: IntegrationTool = "workday" - `"databites"` - `"pageup"` - `"talent360"` +- `"emplypeople"` - `"workdaycustomreport"` - `"workdaycustomreportsftp"` - `"ukgprowfm"` @@ -186,6 +188,7 @@ value: IntegrationTool = "workday" - `"boondmanager"` - `"haileyhr"` - `"silae"` +- `"skello"` - `"oysterhr"` - `"kiwihr"` - `"square"` @@ -206,6 +209,7 @@ value: IntegrationTool = "workday" - `"youforce"` - `"nibelis"` - `"peoplexd"` +- `"zellis"` - `"sftp"` - `"sftpfetch"` - `"360learning"` diff --git a/docs/models/issue.md b/docs/models/issue.md new file mode 100644 index 0000000..0bef3e3 --- /dev/null +++ b/docs/models/issue.md @@ -0,0 +1,14 @@ +# Issue + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | *str* | :heavy_check_mark: | The unique identifier of the issue. | +| `type` | *str* | :heavy_check_mark: | The issue type, for example `integration.authentication_failed`. Kombo will add more types over time. Treat unknown values as valid and handle them without failing. | +| `title` | *str* | :heavy_check_mark: | A short, customer-facing title for this issue type. | +| `status` | [models.IssueStatusChangedWebhookPayloadStatus](../models/issuestatuschangedwebhookpayloadstatus.md) | :heavy_check_mark: | The issue status after this change. | +| `markdown_message` | *str* | :heavy_check_mark: | What is wrong and how to investigate or fix it. | +| `first_observed_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | ISO 8601 timestamp when Kombo first observed this episode of the issue. | +| `resolved_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_check_mark: | ISO 8601 timestamp when the issue was resolved. `null` while it is open. | \ No newline at end of file diff --git a/docs/models/issuestatuschangedwebhookpayload.md b/docs/models/issuestatuschangedwebhookpayload.md new file mode 100644 index 0000000..8a9d2eb --- /dev/null +++ b/docs/models/issuestatuschangedwebhookpayload.md @@ -0,0 +1,10 @@ +# IssueStatusChangedWebhookPayload + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | +| `id` | *str* | :heavy_check_mark: | Unique identifier for this webhook event | +| `type` | [models.IssueStatusChangedWebhookPayloadType](../models/issuestatuschangedwebhookpayloadtype.md) | :heavy_check_mark: | Type of the webhook event | +| `data` | [models.IssueStatusChangedWebhookPayloadData](../models/issuestatuschangedwebhookpayloaddata.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/issuestatuschangedwebhookpayloadcategory.md b/docs/models/issuestatuschangedwebhookpayloadcategory.md new file mode 100644 index 0000000..0dee08e --- /dev/null +++ b/docs/models/issuestatuschangedwebhookpayloadcategory.md @@ -0,0 +1,18 @@ +# IssueStatusChangedWebhookPayloadCategory + +The category of the integration (HRIS, ATS, ASSESSMENT, or LMS). + +## Example Usage + +```python +from kombo.models import IssueStatusChangedWebhookPayloadCategory +value: IssueStatusChangedWebhookPayloadCategory = "HRIS" +``` + + +## Values + +- `"HRIS"` +- `"ATS"` +- `"ASSESSMENT"` +- `"LMS"` diff --git a/docs/models/issuestatuschangedwebhookpayloaddata.md b/docs/models/issuestatuschangedwebhookpayloaddata.md new file mode 100644 index 0000000..7e1cae7 --- /dev/null +++ b/docs/models/issuestatuschangedwebhookpayloaddata.md @@ -0,0 +1,10 @@ +# IssueStatusChangedWebhookPayloadData + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | +| `change` | [models.Change](../models/change.md) | :heavy_check_mark: | Why this webhook was sent: the issue was raised or resolved. | +| `issue` | [models.Issue](../models/issue.md) | :heavy_check_mark: | N/A | +| `integration` | [Nullable[models.Integration]](../models/integration.md) | :heavy_check_mark: | The integration this issue belongs to. `null` for environment-wide issues. | \ No newline at end of file diff --git a/docs/models/issuestatuschangedwebhookpayloadenduser.md b/docs/models/issuestatuschangedwebhookpayloadenduser.md new file mode 100644 index 0000000..6519467 --- /dev/null +++ b/docs/models/issuestatuschangedwebhookpayloadenduser.md @@ -0,0 +1,12 @@ +# IssueStatusChangedWebhookPayloadEndUser + +Information about the end user who created the integration. + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `organization_name` | *str* | :heavy_check_mark: | The name of the organization that owns the integration. | +| `creator_email` | *Nullable[str]* | :heavy_check_mark: | The email address of the user who created the integration. | +| `origin_id` | *Nullable[str]* | :heavy_check_mark: | The unique identifier of the organization in the integrated system. | \ No newline at end of file diff --git a/docs/models/issuestatuschangedwebhookpayloadstatus.md b/docs/models/issuestatuschangedwebhookpayloadstatus.md new file mode 100644 index 0000000..6a9e551 --- /dev/null +++ b/docs/models/issuestatuschangedwebhookpayloadstatus.md @@ -0,0 +1,16 @@ +# IssueStatusChangedWebhookPayloadStatus + +The issue status after this change. + +## Example Usage + +```python +from kombo.models import IssueStatusChangedWebhookPayloadStatus +value: IssueStatusChangedWebhookPayloadStatus = "OPEN" +``` + + +## Values + +- `"OPEN"` +- `"RESOLVED"` diff --git a/docs/models/issuestatuschangedwebhookpayloadtype.md b/docs/models/issuestatuschangedwebhookpayloadtype.md new file mode 100644 index 0000000..7ad2823 --- /dev/null +++ b/docs/models/issuestatuschangedwebhookpayloadtype.md @@ -0,0 +1,15 @@ +# IssueStatusChangedWebhookPayloadType + +Type of the webhook event + +## Example Usage + +```python +from kombo.models import IssueStatusChangedWebhookPayloadType +value: IssueStatusChangedWebhookPayloadType = "issue-status-changed" +``` + + +## Values + +- `"issue-status-changed"` diff --git a/docs/models/lineitem.md b/docs/models/lineitem.md new file mode 100644 index 0000000..5ddffe7 --- /dev/null +++ b/docs/models/lineitem.md @@ -0,0 +1,11 @@ +# LineItem + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `id` | *str* | :heavy_check_mark: | The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing. For some integrations, this ID can still change if the payslip is edited. | +| `remote_id` | *str* | :heavy_check_mark: | The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key. This value may include the item's position on the payslip, which can change if the payslip is edited. | +| `name` | *Nullable[str]* | :heavy_check_mark: | The name of the salary type. | +| `amount` | [OptionalNullable[models.Amount]](../models/amount.md) | :heavy_minus_sign: | The amount of the line item. | \ No newline at end of file diff --git a/docs/models/name.md b/docs/models/name.md index 3f8c6f4..0c88392 100644 --- a/docs/models/name.md +++ b/docs/models/name.md @@ -29,6 +29,10 @@ value: Name = "hris_legal_entities" - `"hris_skills"` - `"hris_skill_rating_providers"` - `"hris_employee_skill_proficiency_ratings"` +- `"hris_pay_runs"` +- `"hris_payslips"` +- `"hris_salary_types"` +- `"hris_payslip_line_items"` - `"ats_users"` - `"ats_jobs"` - `"ats_job_postings"` @@ -42,6 +46,7 @@ value: Name = "hris_legal_entities" - `"ats_rejection_reasons"` - `"ats_roles"` - `"ats_notes"` +- `"ats_scorecards"` - `"lms_users"` - `"lms_course_providers"` - `"lms_skills"` diff --git a/docs/models/payrun.md b/docs/models/payrun.md new file mode 100644 index 0000000..f240528 --- /dev/null +++ b/docs/models/payrun.md @@ -0,0 +1,14 @@ +# PayRun + +The pay run the payslip was paid out through. + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `id` | *str* | :heavy_check_mark: | The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing. | +| `remote_id` | *str* | :heavy_check_mark: | The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key. | +| `start_date` | [datetime](https://docs.python.org/3/library/datetime.html#datetime-objects) | :heavy_check_mark: | The start date of the pay run, as a calendar date (`yyyy-MM-dd`). | +| `end_date` | [datetime](https://docs.python.org/3/library/datetime.html#datetime-objects) | :heavy_check_mark: | The end date of the pay run, as a calendar date (`yyyy-MM-dd`). | +| `legal_entity_id` | *Nullable[str]* | :heavy_check_mark: | The Kombo ID of the pay run’s legal entity. The ID can be used to retrieve the legal entity from the `get legal entities` endpoint. | \ No newline at end of file diff --git a/docs/models/response.md b/docs/models/response.md new file mode 100644 index 0000000..4ade32c --- /dev/null +++ b/docs/models/response.md @@ -0,0 +1,41 @@ +# Response + + +## Supported Types + +### `models.ResultText` + +```python +value: models.ResultText = /* values here */ +``` + +### `models.ResultSingleSelect` + +```python +value: models.ResultSingleSelect = /* values here */ +``` + +### `models.ResultMultiSelect` + +```python +value: models.ResultMultiSelect = /* values here */ +``` + +### `models.ResultBoolean` + +```python +value: models.ResultBoolean = /* values here */ +``` + +### `models.ResultNumber` + +```python +value: models.ResultNumber = /* values here */ +``` + +### `models.ResultDate` + +```python +value: models.ResultDate = /* values here */ +``` + diff --git a/docs/models/resultboolean.md b/docs/models/resultboolean.md new file mode 100644 index 0000000..ddf0342 --- /dev/null +++ b/docs/models/resultboolean.md @@ -0,0 +1,13 @@ +# ResultBoolean + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| `remote_id` | *Nullable[str]* | :heavy_check_mark: | ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric. | +| `label` | *str* | :heavy_check_mark: | The question or attribute being assessed, e.g. "Willingness to travel". | +| `description` | *Nullable[str]* | :heavy_check_mark: | Guidance the ATS shows the interviewer below the question, e.g. "1 is poor, 4 is great". | +| `required` | *Nullable[bool]* | :heavy_check_mark: | Whether the ATS marked this question mandatory. | +| `type` | *Literal["BOOLEAN"]* | :heavy_check_mark: | N/A | +| `answer` | *Nullable[bool]* | :heavy_check_mark: | The yes/no the interviewer picked. | \ No newline at end of file diff --git a/docs/models/resultdate.md b/docs/models/resultdate.md new file mode 100644 index 0000000..abbcc4b --- /dev/null +++ b/docs/models/resultdate.md @@ -0,0 +1,13 @@ +# ResultDate + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| `remote_id` | *Nullable[str]* | :heavy_check_mark: | ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric. | +| `label` | *str* | :heavy_check_mark: | The question or attribute being assessed, e.g. "Willingness to travel". | +| `description` | *Nullable[str]* | :heavy_check_mark: | Guidance the ATS shows the interviewer below the question, e.g. "1 is poor, 4 is great". | +| `required` | *Nullable[bool]* | :heavy_check_mark: | Whether the ATS marked this question mandatory. | +| `type` | *Literal["DATE"]* | :heavy_check_mark: | N/A | +| `answer` | *Nullable[str]* | :heavy_check_mark: | Date in `YYYY-MM-DD` format. | \ No newline at end of file diff --git a/docs/models/resultmultiselect.md b/docs/models/resultmultiselect.md new file mode 100644 index 0000000..d100078 --- /dev/null +++ b/docs/models/resultmultiselect.md @@ -0,0 +1,14 @@ +# ResultMultiSelect + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| `remote_id` | *Nullable[str]* | :heavy_check_mark: | ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric. | +| `label` | *str* | :heavy_check_mark: | The question or attribute being assessed, e.g. "Willingness to travel". | +| `description` | *Nullable[str]* | :heavy_check_mark: | Guidance the ATS shows the interviewer below the question, e.g. "1 is poor, 4 is great". | +| `required` | *Nullable[bool]* | :heavy_check_mark: | Whether the ATS marked this question mandatory. | +| `type` | *Literal["MULTI_SELECT"]* | :heavy_check_mark: | N/A | +| `options` | List[[models.GetAtsScorecardsPositiveResponseOption2](../models/getatsscorecardspositiveresponseoption2.md)] | :heavy_check_mark: | Every option available for select and multi-select questions. | +| `answer` | List[[models.GetAtsScorecardsPositiveResponseAnswer2](../models/getatsscorecardspositiveresponseanswer2.md)] | :heavy_check_mark: | An array of ids and labels with every selected option. | \ No newline at end of file diff --git a/docs/models/resultnumber.md b/docs/models/resultnumber.md new file mode 100644 index 0000000..d0bf839 --- /dev/null +++ b/docs/models/resultnumber.md @@ -0,0 +1,13 @@ +# ResultNumber + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| `remote_id` | *Nullable[str]* | :heavy_check_mark: | ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric. | +| `label` | *str* | :heavy_check_mark: | The question or attribute being assessed, e.g. "Willingness to travel". | +| `description` | *Nullable[str]* | :heavy_check_mark: | Guidance the ATS shows the interviewer below the question, e.g. "1 is poor, 4 is great". | +| `required` | *Nullable[bool]* | :heavy_check_mark: | Whether the ATS marked this question mandatory. | +| `type` | *Literal["NUMBER"]* | :heavy_check_mark: | N/A | +| `answer` | *Nullable[float]* | :heavy_check_mark: | A decimal value. | \ No newline at end of file diff --git a/docs/models/resultsingleselect.md b/docs/models/resultsingleselect.md new file mode 100644 index 0000000..9059fd5 --- /dev/null +++ b/docs/models/resultsingleselect.md @@ -0,0 +1,14 @@ +# ResultSingleSelect + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| `remote_id` | *Nullable[str]* | :heavy_check_mark: | ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric. | +| `label` | *str* | :heavy_check_mark: | The question or attribute being assessed, e.g. "Willingness to travel". | +| `description` | *Nullable[str]* | :heavy_check_mark: | Guidance the ATS shows the interviewer below the question, e.g. "1 is poor, 4 is great". | +| `required` | *Nullable[bool]* | :heavy_check_mark: | Whether the ATS marked this question mandatory. | +| `type` | *Literal["SINGLE_SELECT"]* | :heavy_check_mark: | N/A | +| `options` | List[[models.GetAtsScorecardsPositiveResponseOption1](../models/getatsscorecardspositiveresponseoption1.md)] | :heavy_check_mark: | Every option available for select and multi-select questions. | +| `answer` | [Nullable[models.GetAtsScorecardsPositiveResponseAnswer1]](../models/getatsscorecardspositiveresponseanswer1.md) | :heavy_check_mark: | The id and label of the selected option. | \ No newline at end of file diff --git a/docs/models/resulttext.md b/docs/models/resulttext.md new file mode 100644 index 0000000..e083540 --- /dev/null +++ b/docs/models/resulttext.md @@ -0,0 +1,13 @@ +# ResultText + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| `remote_id` | *Nullable[str]* | :heavy_check_mark: | ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric. | +| `label` | *str* | :heavy_check_mark: | The question or attribute being assessed, e.g. "Willingness to travel". | +| `description` | *Nullable[str]* | :heavy_check_mark: | Guidance the ATS shows the interviewer below the question, e.g. "1 is poor, 4 is great". | +| `required` | *Nullable[bool]* | :heavy_check_mark: | Whether the ATS marked this question mandatory. | +| `type` | *Literal["TEXT"]* | :heavy_check_mark: | N/A | +| `answer` | *Nullable[str]* | :heavy_check_mark: | The text the interviewer wrote. | \ No newline at end of file diff --git a/docs/models/webhookissuestatuschangedwebhookpayloadrequest.md b/docs/models/webhookissuestatuschangedwebhookpayloadrequest.md new file mode 100644 index 0000000..3678e9f --- /dev/null +++ b/docs/models/webhookissuestatuschangedwebhookpayloadrequest.md @@ -0,0 +1,9 @@ +# WebhookIssueStatusChangedWebhookPayloadRequest + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| `x_kombo_signature` | *str* | :heavy_check_mark: | HMAC signature for webhook verification. See the webhook documentation for details on how to verify this signature. | +| `body` | [models.IssueStatusChangedWebhookPayload](../models/issuestatuschangedwebhookpayload.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/sdks/ats/README.md b/docs/sdks/ats/README.md index 3a9eaf4..46ddf30 100644 --- a/docs/sdks/ats/README.md +++ b/docs/sdks/ats/README.md @@ -28,6 +28,7 @@ * [get_rejection_reasons](#get_rejection_reasons) - Get rejection reasons * [get_interviews](#get_interviews) - Get interviews * [get_notes](#get_notes) - Get notes +* [get_ats_scorecards](#get_ats_scorecards) - Get scorecards * [import_tracked_application](#import_tracked_application) - Import tracked application ## get_applications @@ -2132,6 +2133,59 @@ with Kombo( | errors.KomboAtsError | default | application/json | | errors.SDKDefaultError | 4XX, 5XX | \*/\* | +## get_ats_scorecards + +Retrieve all scorecards. + +Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: `(id IN ids) AND (remote_id IN remote_ids)` + +### Example Usage + + +```python +from kombo import Kombo + + +with Kombo( + integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28", + api_key="", +) as k_client: + + res = k_client.ats.get_ats_scorecards(page_size=100, include_deleted=False, ignore_unsupported_filters=False) + + while res is not None: + # Handle items + + res = res.next() + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `cursor` | *Optional[str]* | :heavy_minus_sign: | An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response. | +| `page_size` | *Optional[int]* | :heavy_minus_sign: | The number of results to return per page. Maximum is 250. | +| `updated_after` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged.

If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden.

For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior).

For this endpoint, `updated_after` matches when the returned record changed, or when related data changed as described below.

\| Path \| Added/Removed \| Linked Record \|
\| --- \| --- \| --- \|
\| `author` \| ✗ No \| ✗ No \|
\| `application` \| ✗ No \| ✗ No \|
\| `candidate` \| ✗ No \| ✗ No \|
\| `interview` \| ✗ No \| ✗ No \|

_**Added/Removed**: Whether adding or removing entries from this list triggers an update (n/a for single records). **Linked Record**: Whether changes to the linked record itself trigger an update._ | +| `include_deleted` | *Optional[bool]* | :heavy_minus_sign: | By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too. | +| `ignore_unsupported_filters` | *Optional[bool]* | :heavy_minus_sign: | When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. | +| `ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`. | +| `remote_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of remote IDs. | +| `candidate_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of candidate IDs. Prefer filtering by `candidate_ids` when you want to download the full interview feedback available for a candidate, across all their applications. | +| `application_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of application IDs. We will only return scorecards that belong to _any_ of these applications. | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.GetAtsScorecardsResponse](../../models/getatsscorecardsresponse.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| ---------------------- | ---------------------- | ---------------------- | +| errors.KomboAtsError | default | application/json | +| errors.SDKDefaultError | 4XX, 5XX | \*/\* | + ## import_tracked_application Import tracked application diff --git a/docs/sdks/general/README.md b/docs/sdks/general/README.md index 20c8430..912fd60 100644 --- a/docs/sdks/general/README.md +++ b/docs/sdks/general/README.md @@ -161,6 +161,7 @@ To get started, please pick the relevant API (some tools provide multiple to due |Apploi|`apploi/rest-api`|The [Apploi API](https://integrate.apploi.com/). We automatically authenticate all requests and use `https://partners.apploi.com/` as the base URL.| |Ashby|`ashby/v1`|Ashby's [V1 API](https://developers.ashbyhq.com/reference/introduction). We automatically authenticate all requests with the provided credentials and use `https://api.ashbyhq.com` as the base URL. Please note that Ashby uses an RPC-style API. Please check [the Ashby API documentation](https://developers.ashbyhq.com/reference/introduction) for details on how to use it.| |Asymbl|`asymbl/v63`|We use `https://\{subdomain\}.my.salesforce.com` as the base URL. Find the official docs [here](https://asymblinc.github.io/ats/ats.html).| +|Atlas|`atlas/v1`|We use `https://api.recruitwithatlas.com/api/v1/` as the base URL. Find the official docs [here](https://api.recruitwithatlas.com/api/v1/docs/).| |Avature|`avature/custom-api`|Avatures's Custom API. Call `Get /openapi` to retrieve the specific custom API schema. We automatically authenticate all requests and use the instance specific custom API URL as the base URL.| |Avionté|`avionte/front-office-v1`|Avionte's API. We automatically authenticate all requests and use `https://api.avionte.com/front-office/v1` as the base URL. Documentation for the BOLD Front Office API: https://developer.avionte.com/reference/get-all-talent-tags| |BambooHR|`bamboohr/v1`|BambooHR's [API](https://documentation.bamboohr.com/reference/get-employee). We automatically authenticate all requests using the customer credentials `https://api.bamboohr.com/api/gateway.php/\{subdomain\}/v1` as the base URL.| @@ -204,6 +205,7 @@ To get started, please pick the relevant API (some tools provide multiple to due |Docebo|`docebo/api`|Docebo [API](https://developer.docebo.com). We automatically handle authentication and use `https://\{subdomain\}.docebosaas.com` as the base URL.| |Eightfold|`eightfold/api`|Eightfold's [API](https://apidocs.eightfold.ai/). We automatically authenticate all requests and use `https://apiv2.\{region\}/api/v2/core/` as the base URL.| |Employment Hero|`employmenthero/default`|EmploymentHero [API](https://developer.employmenthero.com/api-references/#icon-book-open-introduction). We automatically authenticate all requests using the credentials supplied by the customer and use `https://api.employmenthero.com/api` as the base URL.| +|Emply People|`emplypeople/v2`|We use `https://api.emply.com/v2` as the base URL. Find the official docs [here](https://api.emply.com/v2/index.html).| |Eploy|`eploy/api`|Eploy's [API](https://www.eploy.com/resources/developers/api-documentation/). We automatically authenticate all requests. The base URL is `https://\{hostname\}/api`, where `\{hostname\}` is either `\{subdomain\}.eploy.net` or your full custom hostname when applicable.| |eRecruiter|`erecruiter/api`|[eRecruiter's API](https://api.erecruiter.net/swagger/ui/index). We automatically authenticate all requests and use `https://\{domain\}/Api` as the base URL.| |Eurécia|`eurecia/api`|Eurécia [REST API](https://api.eurecia.com/eurecia/fw/swagger/index.html#/) We automatically authenticate all requests and use `https://\{domain\}/eurecia/rest` as the base URL.| @@ -217,6 +219,7 @@ To get started, please pick the relevant API (some tools provide multiple to due |Google Workspace|`googleworkspace/people`|[Googles's API](https://developers.google.com/people/api/rest). We automatically authenticate all requests and use 'https://people.googleapis.com' as the base URL.| |Greenhouse (V1)|`greenhouse/harvest-v2`|Greenhouse [Harvest API v2](https://developers.greenhouse.io/harvest.html). We automatically authenticate all requests using the API key and use `https://harvest.greenhouse.io/v2` as the base URL.| |Greenhouse (V1)|`greenhouse/harvest`|Greenhouse [Harvest API v1](https://developers.greenhouse.io/harvest.html). We automatically authenticate all requests using the API key and use `https://harvest.greenhouse.io/v1` as the base URL.| +|Greenhouse (V3)|`greenhousev3/auth`|We use `https://auth.greenhouse.io` as the base URL. Find the official docs [here](https://harvestdocs.greenhouse.io/docs/harvest-partner-oauth).| |Greenhouse (V3)|`greenhousev3/harvestv3`|We use `https://harvest.greenhouse.io/v3` as the base URL. Find the official docs [here](https://harvestdocs.greenhouse.io/reference/).| |Greenhouse Job Board|`greenhousejobboard/boards-api`|[Greenhouse Job Board API](https://developers.greenhouse.io/job-board). We automatically authenticate all requests and use 'https://boards-api.greenhouse.io/v1/boards/\{job_board_token\}' as the base URL. Optionally, you can provide a custom job_board_token to use a different job board.| |Greenhouse|`greenhouse/harvest-v2`|Greenhouse [Harvest API v2](https://developers.greenhouse.io/harvest.html). We automatically authenticate all requests using the API key and use `https://harvest.greenhouse.io/v2` as the base URL.| @@ -235,6 +238,7 @@ To get started, please pick the relevant API (some tools provide multiple to due |HoorayHR|`hoorayhr/api`|[HoorayHR API](https://api.hoorayhr.io/documentation/). We automatically authenticate all requests and use `https://api.hoorayhr.io` as the base URL.| |HR Office|`hroffice/soap`|[HROffice SOAP API](https://api.hroffice.nl/HROfficeCoreService.asmx). We automatically authenticate all requests and wrap them in a SOAP envelope. Build the request `Body` with the raw XML parameters for your operation (e.g., `\1\`). Use `/` as your `path`. Set your `method` to `POST`. You need to specify the `api_options` object and set `operation_name` to the SOAP operation you want to call (e.g., `GetAllJobByLanguage`).| |HR WORKS|`hrworks/v2`|HRWorks's v2 [API](https://developers.hrworks.de/2.0/endpoints). We automatically authenticate all requests using the customer credentials.| +|HR WORKS|`hrworks/v3`|HRWorks's v3 [API](https://developers.hrworks.de/), which covers wage and salary data. We automatically authenticate all requests using the customer credentials.| |HR4YOU|`hr4you/v2`|[HR4YOU's v2 API](https://apiprodemo.hr4you.org/api2/docs). We automatically authenticate all requests and use the customers provided base URL (e.g. `https://your-company.hr4you.org/` or a custom domain).| |Humaans|`humaans/api`|Humaans' [API](https://docs.humaans.io/api/). We automatically authenticate all requests using the API key and use `https://app.humaans.io/api` as the base URL.| |iCIMS|`icims/default`|[iCIMS Default API](https://developer-community.icims.com/). We automatically authenticate all requests and use `https://api.icims.com/customers/\{customer_id\}` as the base url.| @@ -303,6 +307,7 @@ To get started, please pick the relevant API (some tools provide multiple to due |Phenom|`phenom/rest-api`|The [Phenom API](https://developer.phenom.com/). We automatically authenticate all requests and use `https://api-stg.phenompro.com` as the base URL.| |Pinpoint|`pinpoint/v1`|Pinpoint's [JSON:API](https://developers.pinpointhq.com/docs). We automatically authenticate all requests using the `X-API-KEY` header and use `https://\{subdomain\}.pinpointhq.com/api/v1` as the base URL.| |Planday|`planday/api`|Planday's [HR API v1.0](https://openapi.planday.com/api/hr?version=v1.0). We automatically authenticate all requests and use `https://openapi.planday.com` as the base URL.| +|ReachMee|`reachmee/reachmee`|[ReachMee API](https://developer.talentech.io/api-details#api=reachmee-api). We automatically authenticate all requests and use `https://api.talentech.io/reachmee/` as the base URL.| |Recruit CRM|`recruitcrm/api`|We use `https://api.recruitcrm.io` as the base URL. Find the official docs [here](https://docs.recruitcrm.io/docs/rcrm-api-reference/ZG9jOjMyNzk0NA-getting-started).| |RecruiterFlow|`recruiterflow/v1`|RecruiterFlow API [docs](https://docs.recruiterflow.com/). We automatically authenticate all requests using the RF-Api-Key header and use `https://api.recruiterflow.com` as the base URL.| |Remote|`remotecom/default`|Remote's [API](https://remote.com/resources/api/getting-started). We automatically authenticate all requests using provided credentials. The base URL is `https://gateway.remote.com/v1` for production API keys (prefixed `ra_live_`), or `https://gateway.remote-sandbox.com/v1` for sandbox API keys.| @@ -315,6 +320,9 @@ To get started, please pick the relevant API (some tools provide multiple to due |SD Worx|`sdworx/default`|SD Worx's [OData API](https://apistaging.cobra.sdworx.com/Resources). We automatically authenticate all requests using the client ID and secret and use `\{api_url\}` as the base URL.| |Silae|`silae/rest`|[Silae's REST API](https://silae-api.document360.io/docs). We automatically authenticate all requests and use 'https://payroll-api.silae.fr/payroll' as the base URL.| |Simployer|`simployer/v1`|[AlexisHR's v1 API](https://docs.alexishr.com/) We automatically authenticate all requests and use `https://\{subdomain\}.alexishr.com` as base URL.| +|Skello|`skello/svcemployees`|Skello's [Service Employees API](https://swagger.skello.io/?urls.primaryName=Public%20SvcEmployees%20Docs). We automatically authenticate all requests and use `https://svc-employees.skello.io` as the base URL. We also fill in the required `organisationId` query param, which is derived from your API key.| +|Skello|`skello/svcpunch`|Skello's [Service Punch API](https://swagger.skello.io/?urls.primaryName=Public%20SvcPunch%20Docs). We automatically authenticate all requests and use `https://svc-punch.skello.io` as the base URL.| +|Skello|`skello/svcshops`|Skello's [Service Shops API](https://swagger.skello.io/?urls.primaryName=Public%20SvcShops%20Docs). We automatically authenticate all requests and use `https://svc-shops.skello.io` as the base URL. We also fill in the required `organisationId` query param, which is derived from your API key.| |SmartRecruiters|`smartrecruiters/default`|Smartrecruiters [API](https://developers.smartrecruiters.com/reference/apply-api). We automatically authenticate all requests using OAuth and use `https://api.smartrecruiters.com` as the base URL.| |SmartRecruiters|`smartrecruiters/default`|Smartrecruiters [API](https://developers.smartrecruiters.com/reference/apply-api). We automatically authenticate all requests using the credentials supplied by the customer and use `https://api.smartrecruiters.com` as the base URL.| |Softgarden|`softgarden/apply-api`|[Softgarden's Apply API](https://dev.softgarden.de/apply-api/). We automatically authenticate all requests and use 'https://jobdb.softgarden.de/jobdb/public' as base URL.| @@ -323,6 +331,7 @@ To get started, please pick the relevant API (some tools provide multiple to due |Spott|`spott/protected`|The [Spott API](https://docs.gospott.com). We automatically authenticate all requests and use `https://api.gospott.com` as the base URL.| |Sympa|`sympa/api`|Sympa's [API](https://documenter.getpostman.com/view/33639379/2sA3kXG1vX#intro). We automatically authenticate all requests and use `https://api.sympahr.net/api/` as the base URL.| |Taleez|`taleez/0`|[Taleez's API](https://api.taleez.com/swagger-ui/index.html). We automatically authenticate all requests and use `https://api.taleez.com/0` as the base URL.| +|Talent360|`talent360/v3`|We use `https://api.talent360.io/V3` as the base URL. Find the official docs [here](https://api-doc.talent360.io/).| |Talention|`talention/v1`|Talention's API. We automatically authenticate all requests and use `https://\{api_domain\}/tms/\{account_id\}/external/api/1.0` as the base URL. Documentation is provided privately by Talention. Contact Kombo support for assistance with specific endpoints.| |TalentLMS|`talentlms/v2`|We use `https://\{subdomain\}.talentlms.com/api/v2` as the base URL.| |Teamtailor Job Boards|`teamtailorjobboards/direct-apply`|Teamtailor's [Job Board Direct Apply API](https://partner.teamtailor.com/job_boards/direct_apply/#direct-apply). We automatically authenticate all requests and use `https://5qbn6o9x4h.execute-api.eu-west-1.amazonaws.com/production` as the base URL. All requests are automatically signed with HMAC-SHA256 signature.| @@ -347,6 +356,7 @@ To get started, please pick the relevant API (some tools provide multiple to due |Workday|`workday/rest`|[Workday's REST API](https://community.workday.com/sites/default/files/file-hosting/restapi/index.html). We automatically authenticate all requests and use the correct Workday REST base URL for your tenant. The base URL follows the format: https://\{domain\}/api/\{service_name\}/\{version\}/\{tenant\}. You can specify any valid REST endpoint and method. See the Workday REST API documentation for available endpoints. You must specify the `api_options` object and set `service_name` to the name of the service you want to call. You can also specify the `version` (e.g., "v1", "v2"); if omitted, it defaults to "v1".| |Workday|`workday/soap`|[Workday's SOAP API](https://community.workday.com/sites/default/files/file-hosting/productionapi/index.html). We automatically authenticate all requests. Set `data` to your raw xml string. Use `/` as your `path`, as we will always send requests to `https://\{domain\}/ccx/service/\{tenant\}/\{service_name\}`. Set your `method` to `POST`. You need to specify the `api_options` object and set `service_name` to the name of the service you want to call. Find all available services [here](https://community.workday.com/sites/default/files/file-hosting/productionapi/versions/v41.0/index.html). The string that you submit as `data` will be the content of the `soapenv:Body` tag in the request. You can set the `service_version` to any valid Workday service version (the default is `38.2`).| |workforce.com|`workforcecom/api`|Workforce.com [API](https://my.workforce.com/api/v2/documentation). We automatically authenticate all requests using the provided credentials and use `https://my.tanda.co` as the base URL.| +|Zellis|`zellis/api`|Zellis Intelligence Platform [OData API](https://apiportal.hcm.zellis.com/). We automatically authenticate all requests using the provided credentials and use `https://api.hcm.zellis.com/\{customer_code\}/external/odata/v1` as the base URL.| |Zelt|`zelt/partner`|Zelt's [Partner API](https://go.zelt.app/apiv2/swagger). We automatically authenticate all requests using the connected OAuth credentials and use `https://go.zelt.app/apiv2/partner` as the base URL.| |Zoho Recruit|`zohorecruit/v2`|Zoho Recruit's [V2 API](https://www.zoho.com/recruit/developer-guide/apiv2/modules-api.html). We automatically authenticate all requests and use `https://recruit.\{domain\}/recruit/v2` as the base URL.| |Zvoove Recruit|`zvooverecruit/applicants`|[Zvoove Recruit's Applicants API](https://api.zvoove.com/docs/). We automatically authenticate all requests using the applicants API key and use 'https://\{domain\}/api/public' as base URL.| diff --git a/docs/sdks/hris/README.md b/docs/sdks/hris/README.md index 49bdc16..f9c3cfb 100644 --- a/docs/sdks/hris/README.md +++ b/docs/sdks/hris/README.md @@ -22,6 +22,8 @@ * [get_performance_review_cycles](#get_performance_review_cycles) - Get performance review cycles * [get_performance_reviews](#get_performance_reviews) - Get performance reviews * [get_staffing_entities](#get_staffing_entities) - Get staffing entities +* [get_hris_pay_runs](#get_hris_pay_runs) - Pay Runs +* [get_hris_payslips](#get_hris_payslips) - Payslips ## get_employees @@ -1278,6 +1280,116 @@ with Kombo( ### Errors +| Error Type | Status Code | Content Type | +| ---------------------- | ---------------------- | ---------------------- | +| errors.KomboHrisError | default | application/json | +| errors.SDKDefaultError | 4XX, 5XX | \*/\* | + +## get_hris_pay_runs + +Retrieve all pay runs for all legal entities, across all time. + +A pay run represents one payroll cycle for a legal entity, covering a single pay period and grouping the payslips paid out through it. Use this endpoint to reconcile payroll periods and read the totals paid out across each run. Filter by `legal_entity_ids` to scope the results to specific legal entities. + +Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: `(id IN ids) AND (remote_id IN remote_ids)` + +### Example Usage + + +```python +from kombo import Kombo + + +with Kombo( + integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28", + api_key="", +) as k_client: + + res = k_client.hris.get_hris_pay_runs(page_size=100, include_deleted=False, ignore_unsupported_filters=False) + + while res is not None: + # Handle items + + res = res.next() + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `cursor` | *Optional[str]* | :heavy_minus_sign: | An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response. | +| `page_size` | *Optional[int]* | :heavy_minus_sign: | The number of results to return per page. Maximum is 250. | +| `updated_after` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged.

If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden.

For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior).

For this endpoint, only changes to the returned record itself are considered. | +| `include_deleted` | *Optional[bool]* | :heavy_minus_sign: | By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too. | +| `ignore_unsupported_filters` | *Optional[bool]* | :heavy_minus_sign: | When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. | +| `ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`. | +| `remote_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of remote IDs. | +| `legal_entity_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of legal entity IDs. | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.GetHrisPayRunsResponse](../../models/gethrispayrunsresponse.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| ---------------------- | ---------------------- | ---------------------- | +| errors.KomboHrisError | default | application/json | +| errors.SDKDefaultError | 4XX, 5XX | \*/\* | + +## get_hris_payslips + +Retrieve all payslips for all employees, across all time. + +A payslip is the individual pay statement an employee receives for one pay run, detailing what they were paid. Each payslip embeds the `employee` it belongs to and the `pay_run` it was paid out through, its `totals`, and the `line_items` that make it up (earnings, deductions, and contributions). Filter by `employee_ids`, `payrun_ids`, or `legal_entity_ids` to narrow the results. + +Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: `(id IN ids) AND (remote_id IN remote_ids)` + +### Example Usage + + +```python +from kombo import Kombo + + +with Kombo( + integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28", + api_key="", +) as k_client: + + res = k_client.hris.get_hris_payslips(page_size=100, include_deleted=False, ignore_unsupported_filters=False) + + while res is not None: + # Handle items + + res = res.next() + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `cursor` | *Optional[str]* | :heavy_minus_sign: | An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response. | +| `page_size` | *Optional[int]* | :heavy_minus_sign: | The number of results to return per page. Maximum is 250. | +| `updated_after` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged.

If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden.

For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior).

For this endpoint, `updated_after` matches when the returned record changed, or when related data changed as described below.

\| Path \| Added/Removed \| Linked Record \|
\| --- \| --- \| --- \|
\| `employee` \| ✗ No \| ✗ No \|
\| `pay_run` \| ✗ No \| ✗ No \|
\| `line_items` \| ✓ Yes \| ✓ Yes \|
\| `line_items` → `salary_type` \| ✗ No \| ✗ No \|

_**Added/Removed**: Whether adding or removing entries from this list triggers an update (n/a for single records). **Linked Record**: Whether changes to the linked record itself trigger an update._ | +| `include_deleted` | *Optional[bool]* | :heavy_minus_sign: | By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too. | +| `ignore_unsupported_filters` | *Optional[bool]* | :heavy_minus_sign: | When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. | +| `ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`. | +| `remote_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of remote IDs. | +| `legal_entity_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of legal entity IDs. | +| `employee_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of employee IDs. | +| `payrun_ids` | List[*str*] | :heavy_minus_sign: | Filter by a comma-separated list of payrun IDs. | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.GetHrisPayslipsResponse](../../models/gethrispayslipsresponse.md)** + +### Errors + | Error Type | Status Code | Content Type | | ---------------------- | ---------------------- | ---------------------- | | errors.KomboHrisError | default | application/json | diff --git a/pyproject.toml b/pyproject.toml index 4f115ab..61f6546 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "kombo" -version = "1.3.7" +version = "1.4.0" description = "The official Python SDK for the Kombo Unified API" authors = [{ name = "Kombo Technologies GmbH" },] readme = "README-PYPI.md" diff --git a/src/kombo/_version.py b/src/kombo/_version.py index 70412ef..dfe1347 100644 --- a/src/kombo/_version.py +++ b/src/kombo/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "kombo" -__version__: str = "1.3.7" +__version__: str = "1.4.0" __openapi_doc_version__: str = "1.0.0" -__gen_version__: str = "2.928.0" -__user_agent__: str = "speakeasy-sdk/python 1.3.7 2.928.0 1.0.0 kombo" +__gen_version__: str = "2.935.1" +__user_agent__: str = "speakeasy-sdk/python 1.4.0 2.935.1 1.0.0 kombo" try: if __package__ is not None: diff --git a/src/kombo/ats.py b/src/kombo/ats.py index c69e997..5205378 100644 --- a/src/kombo/ats.py +++ b/src/kombo/ats.py @@ -7514,6 +7514,327 @@ async def empty_result(): raise errors.SDKDefaultError("Unexpected response received", http_res) + def get_ats_scorecards( + self, + *, + cursor: Optional[str] = None, + page_size: Optional[int] = 100, + updated_after: Optional[datetime] = None, + include_deleted: Optional[bool] = False, + ignore_unsupported_filters: Optional[bool] = False, + ids: Optional[Iterable[str]] = None, + remote_ids: Optional[Iterable[str]] = None, + candidate_ids: Optional[Iterable[str]] = None, + application_ids: Optional[Iterable[str]] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.GetAtsScorecardsResponse]: + r"""Get scorecards + + Retrieve all scorecards. + + Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: `(id IN ids) AND (remote_id IN remote_ids)` + + :param cursor: An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response. + :param page_size: The number of results to return per page. Maximum is 250. + :param updated_after: Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged. + + If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden. + + For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior). + + For this endpoint, `updated_after` matches when the returned record changed, or when related data changed as described below. + + | Path | Added/Removed | Linked Record | + | --- | --- | --- | + | `author` | ✗ No | ✗ No | + | `application` | ✗ No | ✗ No | + | `candidate` | ✗ No | ✗ No | + | `interview` | ✗ No | ✗ No | + + _**Added/Removed**: Whether adding or removing entries from this list triggers an update (n/a for single records). **Linked Record**: Whether changes to the linked record itself trigger an update._ + :param include_deleted: By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too. + :param ignore_unsupported_filters: When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. + :param ids: Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`. + :param remote_ids: Filter by a comma-separated list of remote IDs. + :param candidate_ids: Filter by a comma-separated list of candidate IDs. Prefer filtering by `candidate_ids` when you want to download the full interview feedback available for a candidate, across all their applications. + :param application_ids: Filter by a comma-separated list of application IDs. We will only return scorecards that belong to _any_ of these applications. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.GetAtsScorecardsRequest( + cursor=cursor, + page_size=page_size, + updated_after=updated_after, + include_deleted=include_deleted, + ignore_unsupported_filters=ignore_unsupported_filters, + ids=utils.unmarshal(ids, Optional[List[str]]), + remote_ids=utils.unmarshal(remote_ids, Optional[List[str]]), + candidate_ids=utils.unmarshal(candidate_ids, Optional[List[str]]), + application_ids=utils.unmarshal(application_ids, Optional[List[str]]), + ) + + req = self._build_request( + method="GET", + path="/ats/scorecards", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=models.GetAtsScorecardsGlobals( + integration_id=self.sdk_configuration.globals.integration_id, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["429", "500", "502", "503", "504"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="GetAtsScorecards", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + tags=["Unified ATS API"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: not utils.match_status_codes(["200"], c), + retry_config=retry_config, + ) + + def next_func() -> Optional[models.GetAtsScorecardsResponse]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + next_cursor = JSONPath("$.data.next").parse(body) + + if len(next_cursor) == 0: + return None + + next_cursor = next_cursor[0] + if next_cursor is None or str(next_cursor).strip() == "": + return None + + return self.get_ats_scorecards( + cursor=next_cursor, + page_size=page_size, + updated_after=updated_after, + include_deleted=include_deleted, + ignore_unsupported_filters=ignore_unsupported_filters, + ids=ids, + remote_ids=remote_ids, + candidate_ids=candidate_ids, + application_ids=application_ids, + retries=retries, + server_url=server_url, + timeout_ms=timeout_ms, + http_headers=http_headers, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return models.GetAtsScorecardsResponse( + result=unmarshal_json_response( + models.GetAtsScorecardsPositiveResponse, http_res + ), + next=next_func, + ) + if utils.match_response(http_res, "default", "application/json"): + response_data = unmarshal_json_response(errors.KomboAtsErrorData, http_res) + raise errors.KomboAtsError(response_data, http_res) + + raise errors.SDKDefaultError("Unexpected response received", http_res) + + async def get_ats_scorecards_async( + self, + *, + cursor: Optional[str] = None, + page_size: Optional[int] = 100, + updated_after: Optional[datetime] = None, + include_deleted: Optional[bool] = False, + ignore_unsupported_filters: Optional[bool] = False, + ids: Optional[Iterable[str]] = None, + remote_ids: Optional[Iterable[str]] = None, + candidate_ids: Optional[Iterable[str]] = None, + application_ids: Optional[Iterable[str]] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.GetAtsScorecardsResponse]: + r"""Get scorecards + + Retrieve all scorecards. + + Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: `(id IN ids) AND (remote_id IN remote_ids)` + + :param cursor: An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response. + :param page_size: The number of results to return per page. Maximum is 250. + :param updated_after: Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged. + + If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden. + + For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior). + + For this endpoint, `updated_after` matches when the returned record changed, or when related data changed as described below. + + | Path | Added/Removed | Linked Record | + | --- | --- | --- | + | `author` | ✗ No | ✗ No | + | `application` | ✗ No | ✗ No | + | `candidate` | ✗ No | ✗ No | + | `interview` | ✗ No | ✗ No | + + _**Added/Removed**: Whether adding or removing entries from this list triggers an update (n/a for single records). **Linked Record**: Whether changes to the linked record itself trigger an update._ + :param include_deleted: By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too. + :param ignore_unsupported_filters: When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. + :param ids: Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`. + :param remote_ids: Filter by a comma-separated list of remote IDs. + :param candidate_ids: Filter by a comma-separated list of candidate IDs. Prefer filtering by `candidate_ids` when you want to download the full interview feedback available for a candidate, across all their applications. + :param application_ids: Filter by a comma-separated list of application IDs. We will only return scorecards that belong to _any_ of these applications. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.GetAtsScorecardsRequest( + cursor=cursor, + page_size=page_size, + updated_after=updated_after, + include_deleted=include_deleted, + ignore_unsupported_filters=ignore_unsupported_filters, + ids=utils.unmarshal(ids, Optional[List[str]]), + remote_ids=utils.unmarshal(remote_ids, Optional[List[str]]), + candidate_ids=utils.unmarshal(candidate_ids, Optional[List[str]]), + application_ids=utils.unmarshal(application_ids, Optional[List[str]]), + ) + + req = self._build_request_async( + method="GET", + path="/ats/scorecards", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=models.GetAtsScorecardsGlobals( + integration_id=self.sdk_configuration.globals.integration_id, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["429", "500", "502", "503", "504"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="GetAtsScorecards", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + tags=["Unified ATS API"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: not utils.match_status_codes(["200"], c), + retry_config=retry_config, + ) + + def next_func() -> Awaitable[Optional[models.GetAtsScorecardsResponse]]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + async def empty_result(): + return None + + next_cursor = JSONPath("$.data.next").parse(body) + + if len(next_cursor) == 0: + return empty_result() + + next_cursor = next_cursor[0] + if next_cursor is None or str(next_cursor).strip() == "": + return empty_result() + + return self.get_ats_scorecards_async( + cursor=next_cursor, + page_size=page_size, + updated_after=updated_after, + include_deleted=include_deleted, + ignore_unsupported_filters=ignore_unsupported_filters, + ids=ids, + remote_ids=remote_ids, + candidate_ids=candidate_ids, + application_ids=application_ids, + retries=retries, + server_url=server_url, + timeout_ms=timeout_ms, + http_headers=http_headers, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return models.GetAtsScorecardsResponse( + result=unmarshal_json_response( + models.GetAtsScorecardsPositiveResponse, http_res + ), + next=next_func, + ) + if utils.match_response(http_res, "default", "application/json"): + response_data = unmarshal_json_response(errors.KomboAtsErrorData, http_res) + raise errors.KomboAtsError(response_data, http_res) + + raise errors.SDKDefaultError("Unexpected response received", http_res) + def import_tracked_application( self, *, diff --git a/src/kombo/general.py b/src/kombo/general.py index 7bbf279..c2bff81 100644 --- a/src/kombo/general.py +++ b/src/kombo/general.py @@ -410,6 +410,7 @@ def send_passthrough_request( |Apploi|`apploi/rest-api`|The [Apploi API](https://integrate.apploi.com/). We automatically authenticate all requests and use `https://partners.apploi.com/` as the base URL.| |Ashby|`ashby/v1`|Ashby's [V1 API](https://developers.ashbyhq.com/reference/introduction). We automatically authenticate all requests with the provided credentials and use `https://api.ashbyhq.com` as the base URL. Please note that Ashby uses an RPC-style API. Please check [the Ashby API documentation](https://developers.ashbyhq.com/reference/introduction) for details on how to use it.| |Asymbl|`asymbl/v63`|We use `https://\{subdomain\}.my.salesforce.com` as the base URL. Find the official docs [here](https://asymblinc.github.io/ats/ats.html).| + |Atlas|`atlas/v1`|We use `https://api.recruitwithatlas.com/api/v1/` as the base URL. Find the official docs [here](https://api.recruitwithatlas.com/api/v1/docs/).| |Avature|`avature/custom-api`|Avatures's Custom API. Call `Get /openapi` to retrieve the specific custom API schema. We automatically authenticate all requests and use the instance specific custom API URL as the base URL.| |Avionté|`avionte/front-office-v1`|Avionte's API. We automatically authenticate all requests and use `https://api.avionte.com/front-office/v1` as the base URL. Documentation for the BOLD Front Office API: https://developer.avionte.com/reference/get-all-talent-tags| |BambooHR|`bamboohr/v1`|BambooHR's [API](https://documentation.bamboohr.com/reference/get-employee). We automatically authenticate all requests using the customer credentials `https://api.bamboohr.com/api/gateway.php/\{subdomain\}/v1` as the base URL.| @@ -453,6 +454,7 @@ def send_passthrough_request( |Docebo|`docebo/api`|Docebo [API](https://developer.docebo.com). We automatically handle authentication and use `https://\{subdomain\}.docebosaas.com` as the base URL.| |Eightfold|`eightfold/api`|Eightfold's [API](https://apidocs.eightfold.ai/). We automatically authenticate all requests and use `https://apiv2.\{region\}/api/v2/core/` as the base URL.| |Employment Hero|`employmenthero/default`|EmploymentHero [API](https://developer.employmenthero.com/api-references/#icon-book-open-introduction). We automatically authenticate all requests using the credentials supplied by the customer and use `https://api.employmenthero.com/api` as the base URL.| + |Emply People|`emplypeople/v2`|We use `https://api.emply.com/v2` as the base URL. Find the official docs [here](https://api.emply.com/v2/index.html).| |Eploy|`eploy/api`|Eploy's [API](https://www.eploy.com/resources/developers/api-documentation/). We automatically authenticate all requests. The base URL is `https://\{hostname\}/api`, where `\{hostname\}` is either `\{subdomain\}.eploy.net` or your full custom hostname when applicable.| |eRecruiter|`erecruiter/api`|[eRecruiter's API](https://api.erecruiter.net/swagger/ui/index). We automatically authenticate all requests and use `https://\{domain\}/Api` as the base URL.| |Eurécia|`eurecia/api`|Eurécia [REST API](https://api.eurecia.com/eurecia/fw/swagger/index.html#/) We automatically authenticate all requests and use `https://\{domain\}/eurecia/rest` as the base URL.| @@ -466,6 +468,7 @@ def send_passthrough_request( |Google Workspace|`googleworkspace/people`|[Googles's API](https://developers.google.com/people/api/rest). We automatically authenticate all requests and use 'https://people.googleapis.com' as the base URL.| |Greenhouse (V1)|`greenhouse/harvest-v2`|Greenhouse [Harvest API v2](https://developers.greenhouse.io/harvest.html). We automatically authenticate all requests using the API key and use `https://harvest.greenhouse.io/v2` as the base URL.| |Greenhouse (V1)|`greenhouse/harvest`|Greenhouse [Harvest API v1](https://developers.greenhouse.io/harvest.html). We automatically authenticate all requests using the API key and use `https://harvest.greenhouse.io/v1` as the base URL.| + |Greenhouse (V3)|`greenhousev3/auth`|We use `https://auth.greenhouse.io` as the base URL. Find the official docs [here](https://harvestdocs.greenhouse.io/docs/harvest-partner-oauth).| |Greenhouse (V3)|`greenhousev3/harvestv3`|We use `https://harvest.greenhouse.io/v3` as the base URL. Find the official docs [here](https://harvestdocs.greenhouse.io/reference/).| |Greenhouse Job Board|`greenhousejobboard/boards-api`|[Greenhouse Job Board API](https://developers.greenhouse.io/job-board). We automatically authenticate all requests and use 'https://boards-api.greenhouse.io/v1/boards/\{job_board_token\}' as the base URL. Optionally, you can provide a custom job_board_token to use a different job board.| |Greenhouse|`greenhouse/harvest-v2`|Greenhouse [Harvest API v2](https://developers.greenhouse.io/harvest.html). We automatically authenticate all requests using the API key and use `https://harvest.greenhouse.io/v2` as the base URL.| @@ -484,6 +487,7 @@ def send_passthrough_request( |HoorayHR|`hoorayhr/api`|[HoorayHR API](https://api.hoorayhr.io/documentation/). We automatically authenticate all requests and use `https://api.hoorayhr.io` as the base URL.| |HR Office|`hroffice/soap`|[HROffice SOAP API](https://api.hroffice.nl/HROfficeCoreService.asmx). We automatically authenticate all requests and wrap them in a SOAP envelope. Build the request `Body` with the raw XML parameters for your operation (e.g., `\1\`). Use `/` as your `path`. Set your `method` to `POST`. You need to specify the `api_options` object and set `operation_name` to the SOAP operation you want to call (e.g., `GetAllJobByLanguage`).| |HR WORKS|`hrworks/v2`|HRWorks's v2 [API](https://developers.hrworks.de/2.0/endpoints). We automatically authenticate all requests using the customer credentials.| + |HR WORKS|`hrworks/v3`|HRWorks's v3 [API](https://developers.hrworks.de/), which covers wage and salary data. We automatically authenticate all requests using the customer credentials.| |HR4YOU|`hr4you/v2`|[HR4YOU's v2 API](https://apiprodemo.hr4you.org/api2/docs). We automatically authenticate all requests and use the customers provided base URL (e.g. `https://your-company.hr4you.org/` or a custom domain).| |Humaans|`humaans/api`|Humaans' [API](https://docs.humaans.io/api/). We automatically authenticate all requests using the API key and use `https://app.humaans.io/api` as the base URL.| |iCIMS|`icims/default`|[iCIMS Default API](https://developer-community.icims.com/). We automatically authenticate all requests and use `https://api.icims.com/customers/\{customer_id\}` as the base url.| @@ -552,6 +556,7 @@ def send_passthrough_request( |Phenom|`phenom/rest-api`|The [Phenom API](https://developer.phenom.com/). We automatically authenticate all requests and use `https://api-stg.phenompro.com` as the base URL.| |Pinpoint|`pinpoint/v1`|Pinpoint's [JSON:API](https://developers.pinpointhq.com/docs). We automatically authenticate all requests using the `X-API-KEY` header and use `https://\{subdomain\}.pinpointhq.com/api/v1` as the base URL.| |Planday|`planday/api`|Planday's [HR API v1.0](https://openapi.planday.com/api/hr?version=v1.0). We automatically authenticate all requests and use `https://openapi.planday.com` as the base URL.| + |ReachMee|`reachmee/reachmee`|[ReachMee API](https://developer.talentech.io/api-details#api=reachmee-api). We automatically authenticate all requests and use `https://api.talentech.io/reachmee/` as the base URL.| |Recruit CRM|`recruitcrm/api`|We use `https://api.recruitcrm.io` as the base URL. Find the official docs [here](https://docs.recruitcrm.io/docs/rcrm-api-reference/ZG9jOjMyNzk0NA-getting-started).| |RecruiterFlow|`recruiterflow/v1`|RecruiterFlow API [docs](https://docs.recruiterflow.com/). We automatically authenticate all requests using the RF-Api-Key header and use `https://api.recruiterflow.com` as the base URL.| |Remote|`remotecom/default`|Remote's [API](https://remote.com/resources/api/getting-started). We automatically authenticate all requests using provided credentials. The base URL is `https://gateway.remote.com/v1` for production API keys (prefixed `ra_live_`), or `https://gateway.remote-sandbox.com/v1` for sandbox API keys.| @@ -564,6 +569,9 @@ def send_passthrough_request( |SD Worx|`sdworx/default`|SD Worx's [OData API](https://apistaging.cobra.sdworx.com/Resources). We automatically authenticate all requests using the client ID and secret and use `\{api_url\}` as the base URL.| |Silae|`silae/rest`|[Silae's REST API](https://silae-api.document360.io/docs). We automatically authenticate all requests and use 'https://payroll-api.silae.fr/payroll' as the base URL.| |Simployer|`simployer/v1`|[AlexisHR's v1 API](https://docs.alexishr.com/) We automatically authenticate all requests and use `https://\{subdomain\}.alexishr.com` as base URL.| + |Skello|`skello/svcemployees`|Skello's [Service Employees API](https://swagger.skello.io/?urls.primaryName=Public%20SvcEmployees%20Docs). We automatically authenticate all requests and use `https://svc-employees.skello.io` as the base URL. We also fill in the required `organisationId` query param, which is derived from your API key.| + |Skello|`skello/svcpunch`|Skello's [Service Punch API](https://swagger.skello.io/?urls.primaryName=Public%20SvcPunch%20Docs). We automatically authenticate all requests and use `https://svc-punch.skello.io` as the base URL.| + |Skello|`skello/svcshops`|Skello's [Service Shops API](https://swagger.skello.io/?urls.primaryName=Public%20SvcShops%20Docs). We automatically authenticate all requests and use `https://svc-shops.skello.io` as the base URL. We also fill in the required `organisationId` query param, which is derived from your API key.| |SmartRecruiters|`smartrecruiters/default`|Smartrecruiters [API](https://developers.smartrecruiters.com/reference/apply-api). We automatically authenticate all requests using OAuth and use `https://api.smartrecruiters.com` as the base URL.| |SmartRecruiters|`smartrecruiters/default`|Smartrecruiters [API](https://developers.smartrecruiters.com/reference/apply-api). We automatically authenticate all requests using the credentials supplied by the customer and use `https://api.smartrecruiters.com` as the base URL.| |Softgarden|`softgarden/apply-api`|[Softgarden's Apply API](https://dev.softgarden.de/apply-api/). We automatically authenticate all requests and use 'https://jobdb.softgarden.de/jobdb/public' as base URL.| @@ -572,6 +580,7 @@ def send_passthrough_request( |Spott|`spott/protected`|The [Spott API](https://docs.gospott.com). We automatically authenticate all requests and use `https://api.gospott.com` as the base URL.| |Sympa|`sympa/api`|Sympa's [API](https://documenter.getpostman.com/view/33639379/2sA3kXG1vX#intro). We automatically authenticate all requests and use `https://api.sympahr.net/api/` as the base URL.| |Taleez|`taleez/0`|[Taleez's API](https://api.taleez.com/swagger-ui/index.html). We automatically authenticate all requests and use `https://api.taleez.com/0` as the base URL.| + |Talent360|`talent360/v3`|We use `https://api.talent360.io/V3` as the base URL. Find the official docs [here](https://api-doc.talent360.io/).| |Talention|`talention/v1`|Talention's API. We automatically authenticate all requests and use `https://\{api_domain\}/tms/\{account_id\}/external/api/1.0` as the base URL. Documentation is provided privately by Talention. Contact Kombo support for assistance with specific endpoints.| |TalentLMS|`talentlms/v2`|We use `https://\{subdomain\}.talentlms.com/api/v2` as the base URL.| |Teamtailor Job Boards|`teamtailorjobboards/direct-apply`|Teamtailor's [Job Board Direct Apply API](https://partner.teamtailor.com/job_boards/direct_apply/#direct-apply). We automatically authenticate all requests and use `https://5qbn6o9x4h.execute-api.eu-west-1.amazonaws.com/production` as the base URL. All requests are automatically signed with HMAC-SHA256 signature.| @@ -596,6 +605,7 @@ def send_passthrough_request( |Workday|`workday/rest`|[Workday's REST API](https://community.workday.com/sites/default/files/file-hosting/restapi/index.html). We automatically authenticate all requests and use the correct Workday REST base URL for your tenant. The base URL follows the format: https://\{domain\}/api/\{service_name\}/\{version\}/\{tenant\}. You can specify any valid REST endpoint and method. See the Workday REST API documentation for available endpoints. You must specify the `api_options` object and set `service_name` to the name of the service you want to call. You can also specify the `version` (e.g., \"v1\", \"v2\"); if omitted, it defaults to \"v1\".| |Workday|`workday/soap`|[Workday's SOAP API](https://community.workday.com/sites/default/files/file-hosting/productionapi/index.html). We automatically authenticate all requests. Set `data` to your raw xml string. Use `/` as your `path`, as we will always send requests to `https://\{domain\}/ccx/service/\{tenant\}/\{service_name\}`. Set your `method` to `POST`. You need to specify the `api_options` object and set `service_name` to the name of the service you want to call. Find all available services [here](https://community.workday.com/sites/default/files/file-hosting/productionapi/versions/v41.0/index.html). The string that you submit as `data` will be the content of the `soapenv:Body` tag in the request. You can set the `service_version` to any valid Workday service version (the default is `38.2`).| |workforce.com|`workforcecom/api`|Workforce.com [API](https://my.workforce.com/api/v2/documentation). We automatically authenticate all requests using the provided credentials and use `https://my.tanda.co` as the base URL.| + |Zellis|`zellis/api`|Zellis Intelligence Platform [OData API](https://apiportal.hcm.zellis.com/). We automatically authenticate all requests using the provided credentials and use `https://api.hcm.zellis.com/\{customer_code\}/external/odata/v1` as the base URL.| |Zelt|`zelt/partner`|Zelt's [Partner API](https://go.zelt.app/apiv2/swagger). We automatically authenticate all requests using the connected OAuth credentials and use `https://go.zelt.app/apiv2/partner` as the base URL.| |Zoho Recruit|`zohorecruit/v2`|Zoho Recruit's [V2 API](https://www.zoho.com/recruit/developer-guide/apiv2/modules-api.html). We automatically authenticate all requests and use `https://recruit.\{domain\}/recruit/v2` as the base URL.| |Zvoove Recruit|`zvooverecruit/applicants`|[Zvoove Recruit's Applicants API](https://api.zvoove.com/docs/). We automatically authenticate all requests using the applicants API key and use 'https://\{domain\}/api/public' as base URL.| @@ -759,6 +769,7 @@ async def send_passthrough_request_async( |Apploi|`apploi/rest-api`|The [Apploi API](https://integrate.apploi.com/). We automatically authenticate all requests and use `https://partners.apploi.com/` as the base URL.| |Ashby|`ashby/v1`|Ashby's [V1 API](https://developers.ashbyhq.com/reference/introduction). We automatically authenticate all requests with the provided credentials and use `https://api.ashbyhq.com` as the base URL. Please note that Ashby uses an RPC-style API. Please check [the Ashby API documentation](https://developers.ashbyhq.com/reference/introduction) for details on how to use it.| |Asymbl|`asymbl/v63`|We use `https://\{subdomain\}.my.salesforce.com` as the base URL. Find the official docs [here](https://asymblinc.github.io/ats/ats.html).| + |Atlas|`atlas/v1`|We use `https://api.recruitwithatlas.com/api/v1/` as the base URL. Find the official docs [here](https://api.recruitwithatlas.com/api/v1/docs/).| |Avature|`avature/custom-api`|Avatures's Custom API. Call `Get /openapi` to retrieve the specific custom API schema. We automatically authenticate all requests and use the instance specific custom API URL as the base URL.| |Avionté|`avionte/front-office-v1`|Avionte's API. We automatically authenticate all requests and use `https://api.avionte.com/front-office/v1` as the base URL. Documentation for the BOLD Front Office API: https://developer.avionte.com/reference/get-all-talent-tags| |BambooHR|`bamboohr/v1`|BambooHR's [API](https://documentation.bamboohr.com/reference/get-employee). We automatically authenticate all requests using the customer credentials `https://api.bamboohr.com/api/gateway.php/\{subdomain\}/v1` as the base URL.| @@ -802,6 +813,7 @@ async def send_passthrough_request_async( |Docebo|`docebo/api`|Docebo [API](https://developer.docebo.com). We automatically handle authentication and use `https://\{subdomain\}.docebosaas.com` as the base URL.| |Eightfold|`eightfold/api`|Eightfold's [API](https://apidocs.eightfold.ai/). We automatically authenticate all requests and use `https://apiv2.\{region\}/api/v2/core/` as the base URL.| |Employment Hero|`employmenthero/default`|EmploymentHero [API](https://developer.employmenthero.com/api-references/#icon-book-open-introduction). We automatically authenticate all requests using the credentials supplied by the customer and use `https://api.employmenthero.com/api` as the base URL.| + |Emply People|`emplypeople/v2`|We use `https://api.emply.com/v2` as the base URL. Find the official docs [here](https://api.emply.com/v2/index.html).| |Eploy|`eploy/api`|Eploy's [API](https://www.eploy.com/resources/developers/api-documentation/). We automatically authenticate all requests. The base URL is `https://\{hostname\}/api`, where `\{hostname\}` is either `\{subdomain\}.eploy.net` or your full custom hostname when applicable.| |eRecruiter|`erecruiter/api`|[eRecruiter's API](https://api.erecruiter.net/swagger/ui/index). We automatically authenticate all requests and use `https://\{domain\}/Api` as the base URL.| |Eurécia|`eurecia/api`|Eurécia [REST API](https://api.eurecia.com/eurecia/fw/swagger/index.html#/) We automatically authenticate all requests and use `https://\{domain\}/eurecia/rest` as the base URL.| @@ -815,6 +827,7 @@ async def send_passthrough_request_async( |Google Workspace|`googleworkspace/people`|[Googles's API](https://developers.google.com/people/api/rest). We automatically authenticate all requests and use 'https://people.googleapis.com' as the base URL.| |Greenhouse (V1)|`greenhouse/harvest-v2`|Greenhouse [Harvest API v2](https://developers.greenhouse.io/harvest.html). We automatically authenticate all requests using the API key and use `https://harvest.greenhouse.io/v2` as the base URL.| |Greenhouse (V1)|`greenhouse/harvest`|Greenhouse [Harvest API v1](https://developers.greenhouse.io/harvest.html). We automatically authenticate all requests using the API key and use `https://harvest.greenhouse.io/v1` as the base URL.| + |Greenhouse (V3)|`greenhousev3/auth`|We use `https://auth.greenhouse.io` as the base URL. Find the official docs [here](https://harvestdocs.greenhouse.io/docs/harvest-partner-oauth).| |Greenhouse (V3)|`greenhousev3/harvestv3`|We use `https://harvest.greenhouse.io/v3` as the base URL. Find the official docs [here](https://harvestdocs.greenhouse.io/reference/).| |Greenhouse Job Board|`greenhousejobboard/boards-api`|[Greenhouse Job Board API](https://developers.greenhouse.io/job-board). We automatically authenticate all requests and use 'https://boards-api.greenhouse.io/v1/boards/\{job_board_token\}' as the base URL. Optionally, you can provide a custom job_board_token to use a different job board.| |Greenhouse|`greenhouse/harvest-v2`|Greenhouse [Harvest API v2](https://developers.greenhouse.io/harvest.html). We automatically authenticate all requests using the API key and use `https://harvest.greenhouse.io/v2` as the base URL.| @@ -833,6 +846,7 @@ async def send_passthrough_request_async( |HoorayHR|`hoorayhr/api`|[HoorayHR API](https://api.hoorayhr.io/documentation/). We automatically authenticate all requests and use `https://api.hoorayhr.io` as the base URL.| |HR Office|`hroffice/soap`|[HROffice SOAP API](https://api.hroffice.nl/HROfficeCoreService.asmx). We automatically authenticate all requests and wrap them in a SOAP envelope. Build the request `Body` with the raw XML parameters for your operation (e.g., `\1\`). Use `/` as your `path`. Set your `method` to `POST`. You need to specify the `api_options` object and set `operation_name` to the SOAP operation you want to call (e.g., `GetAllJobByLanguage`).| |HR WORKS|`hrworks/v2`|HRWorks's v2 [API](https://developers.hrworks.de/2.0/endpoints). We automatically authenticate all requests using the customer credentials.| + |HR WORKS|`hrworks/v3`|HRWorks's v3 [API](https://developers.hrworks.de/), which covers wage and salary data. We automatically authenticate all requests using the customer credentials.| |HR4YOU|`hr4you/v2`|[HR4YOU's v2 API](https://apiprodemo.hr4you.org/api2/docs). We automatically authenticate all requests and use the customers provided base URL (e.g. `https://your-company.hr4you.org/` or a custom domain).| |Humaans|`humaans/api`|Humaans' [API](https://docs.humaans.io/api/). We automatically authenticate all requests using the API key and use `https://app.humaans.io/api` as the base URL.| |iCIMS|`icims/default`|[iCIMS Default API](https://developer-community.icims.com/). We automatically authenticate all requests and use `https://api.icims.com/customers/\{customer_id\}` as the base url.| @@ -901,6 +915,7 @@ async def send_passthrough_request_async( |Phenom|`phenom/rest-api`|The [Phenom API](https://developer.phenom.com/). We automatically authenticate all requests and use `https://api-stg.phenompro.com` as the base URL.| |Pinpoint|`pinpoint/v1`|Pinpoint's [JSON:API](https://developers.pinpointhq.com/docs). We automatically authenticate all requests using the `X-API-KEY` header and use `https://\{subdomain\}.pinpointhq.com/api/v1` as the base URL.| |Planday|`planday/api`|Planday's [HR API v1.0](https://openapi.planday.com/api/hr?version=v1.0). We automatically authenticate all requests and use `https://openapi.planday.com` as the base URL.| + |ReachMee|`reachmee/reachmee`|[ReachMee API](https://developer.talentech.io/api-details#api=reachmee-api). We automatically authenticate all requests and use `https://api.talentech.io/reachmee/` as the base URL.| |Recruit CRM|`recruitcrm/api`|We use `https://api.recruitcrm.io` as the base URL. Find the official docs [here](https://docs.recruitcrm.io/docs/rcrm-api-reference/ZG9jOjMyNzk0NA-getting-started).| |RecruiterFlow|`recruiterflow/v1`|RecruiterFlow API [docs](https://docs.recruiterflow.com/). We automatically authenticate all requests using the RF-Api-Key header and use `https://api.recruiterflow.com` as the base URL.| |Remote|`remotecom/default`|Remote's [API](https://remote.com/resources/api/getting-started). We automatically authenticate all requests using provided credentials. The base URL is `https://gateway.remote.com/v1` for production API keys (prefixed `ra_live_`), or `https://gateway.remote-sandbox.com/v1` for sandbox API keys.| @@ -913,6 +928,9 @@ async def send_passthrough_request_async( |SD Worx|`sdworx/default`|SD Worx's [OData API](https://apistaging.cobra.sdworx.com/Resources). We automatically authenticate all requests using the client ID and secret and use `\{api_url\}` as the base URL.| |Silae|`silae/rest`|[Silae's REST API](https://silae-api.document360.io/docs). We automatically authenticate all requests and use 'https://payroll-api.silae.fr/payroll' as the base URL.| |Simployer|`simployer/v1`|[AlexisHR's v1 API](https://docs.alexishr.com/) We automatically authenticate all requests and use `https://\{subdomain\}.alexishr.com` as base URL.| + |Skello|`skello/svcemployees`|Skello's [Service Employees API](https://swagger.skello.io/?urls.primaryName=Public%20SvcEmployees%20Docs). We automatically authenticate all requests and use `https://svc-employees.skello.io` as the base URL. We also fill in the required `organisationId` query param, which is derived from your API key.| + |Skello|`skello/svcpunch`|Skello's [Service Punch API](https://swagger.skello.io/?urls.primaryName=Public%20SvcPunch%20Docs). We automatically authenticate all requests and use `https://svc-punch.skello.io` as the base URL.| + |Skello|`skello/svcshops`|Skello's [Service Shops API](https://swagger.skello.io/?urls.primaryName=Public%20SvcShops%20Docs). We automatically authenticate all requests and use `https://svc-shops.skello.io` as the base URL. We also fill in the required `organisationId` query param, which is derived from your API key.| |SmartRecruiters|`smartrecruiters/default`|Smartrecruiters [API](https://developers.smartrecruiters.com/reference/apply-api). We automatically authenticate all requests using OAuth and use `https://api.smartrecruiters.com` as the base URL.| |SmartRecruiters|`smartrecruiters/default`|Smartrecruiters [API](https://developers.smartrecruiters.com/reference/apply-api). We automatically authenticate all requests using the credentials supplied by the customer and use `https://api.smartrecruiters.com` as the base URL.| |Softgarden|`softgarden/apply-api`|[Softgarden's Apply API](https://dev.softgarden.de/apply-api/). We automatically authenticate all requests and use 'https://jobdb.softgarden.de/jobdb/public' as base URL.| @@ -921,6 +939,7 @@ async def send_passthrough_request_async( |Spott|`spott/protected`|The [Spott API](https://docs.gospott.com). We automatically authenticate all requests and use `https://api.gospott.com` as the base URL.| |Sympa|`sympa/api`|Sympa's [API](https://documenter.getpostman.com/view/33639379/2sA3kXG1vX#intro). We automatically authenticate all requests and use `https://api.sympahr.net/api/` as the base URL.| |Taleez|`taleez/0`|[Taleez's API](https://api.taleez.com/swagger-ui/index.html). We automatically authenticate all requests and use `https://api.taleez.com/0` as the base URL.| + |Talent360|`talent360/v3`|We use `https://api.talent360.io/V3` as the base URL. Find the official docs [here](https://api-doc.talent360.io/).| |Talention|`talention/v1`|Talention's API. We automatically authenticate all requests and use `https://\{api_domain\}/tms/\{account_id\}/external/api/1.0` as the base URL. Documentation is provided privately by Talention. Contact Kombo support for assistance with specific endpoints.| |TalentLMS|`talentlms/v2`|We use `https://\{subdomain\}.talentlms.com/api/v2` as the base URL.| |Teamtailor Job Boards|`teamtailorjobboards/direct-apply`|Teamtailor's [Job Board Direct Apply API](https://partner.teamtailor.com/job_boards/direct_apply/#direct-apply). We automatically authenticate all requests and use `https://5qbn6o9x4h.execute-api.eu-west-1.amazonaws.com/production` as the base URL. All requests are automatically signed with HMAC-SHA256 signature.| @@ -945,6 +964,7 @@ async def send_passthrough_request_async( |Workday|`workday/rest`|[Workday's REST API](https://community.workday.com/sites/default/files/file-hosting/restapi/index.html). We automatically authenticate all requests and use the correct Workday REST base URL for your tenant. The base URL follows the format: https://\{domain\}/api/\{service_name\}/\{version\}/\{tenant\}. You can specify any valid REST endpoint and method. See the Workday REST API documentation for available endpoints. You must specify the `api_options` object and set `service_name` to the name of the service you want to call. You can also specify the `version` (e.g., \"v1\", \"v2\"); if omitted, it defaults to \"v1\".| |Workday|`workday/soap`|[Workday's SOAP API](https://community.workday.com/sites/default/files/file-hosting/productionapi/index.html). We automatically authenticate all requests. Set `data` to your raw xml string. Use `/` as your `path`, as we will always send requests to `https://\{domain\}/ccx/service/\{tenant\}/\{service_name\}`. Set your `method` to `POST`. You need to specify the `api_options` object and set `service_name` to the name of the service you want to call. Find all available services [here](https://community.workday.com/sites/default/files/file-hosting/productionapi/versions/v41.0/index.html). The string that you submit as `data` will be the content of the `soapenv:Body` tag in the request. You can set the `service_version` to any valid Workday service version (the default is `38.2`).| |workforce.com|`workforcecom/api`|Workforce.com [API](https://my.workforce.com/api/v2/documentation). We automatically authenticate all requests using the provided credentials and use `https://my.tanda.co` as the base URL.| + |Zellis|`zellis/api`|Zellis Intelligence Platform [OData API](https://apiportal.hcm.zellis.com/). We automatically authenticate all requests using the provided credentials and use `https://api.hcm.zellis.com/\{customer_code\}/external/odata/v1` as the base URL.| |Zelt|`zelt/partner`|Zelt's [Partner API](https://go.zelt.app/apiv2/swagger). We automatically authenticate all requests using the connected OAuth credentials and use `https://go.zelt.app/apiv2/partner` as the base URL.| |Zoho Recruit|`zohorecruit/v2`|Zoho Recruit's [V2 API](https://www.zoho.com/recruit/developer-guide/apiv2/modules-api.html). We automatically authenticate all requests and use `https://recruit.\{domain\}/recruit/v2` as the base URL.| |Zvoove Recruit|`zvooverecruit/applicants`|[Zvoove Recruit's Applicants API](https://api.zvoove.com/docs/). We automatically authenticate all requests using the applicants API key and use 'https://\{domain\}/api/public' as base URL.| diff --git a/src/kombo/hris.py b/src/kombo/hris.py index 62e8579..fd59c77 100644 --- a/src/kombo/hris.py +++ b/src/kombo/hris.py @@ -5519,3 +5519,635 @@ async def empty_result(): raise errors.KomboHrisError(response_data, http_res) raise errors.SDKDefaultError("Unexpected response received", http_res) + + def get_hris_pay_runs( + self, + *, + cursor: Optional[str] = None, + page_size: Optional[int] = 100, + updated_after: Optional[datetime] = None, + include_deleted: Optional[bool] = False, + ignore_unsupported_filters: Optional[bool] = False, + ids: Optional[Iterable[str]] = None, + remote_ids: Optional[Iterable[str]] = None, + legal_entity_ids: Optional[Iterable[str]] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.GetHrisPayRunsResponse]: + r"""Pay Runs + + Retrieve all pay runs for all legal entities, across all time. + + A pay run represents one payroll cycle for a legal entity, covering a single pay period and grouping the payslips paid out through it. Use this endpoint to reconcile payroll periods and read the totals paid out across each run. Filter by `legal_entity_ids` to scope the results to specific legal entities. + + Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: `(id IN ids) AND (remote_id IN remote_ids)` + + :param cursor: An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response. + :param page_size: The number of results to return per page. Maximum is 250. + :param updated_after: Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged. + + If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden. + + For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior). + + For this endpoint, only changes to the returned record itself are considered. + :param include_deleted: By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too. + :param ignore_unsupported_filters: When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. + :param ids: Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`. + :param remote_ids: Filter by a comma-separated list of remote IDs. + :param legal_entity_ids: Filter by a comma-separated list of legal entity IDs. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.GetHrisPayRunsRequest( + cursor=cursor, + page_size=page_size, + updated_after=updated_after, + include_deleted=include_deleted, + ignore_unsupported_filters=ignore_unsupported_filters, + ids=utils.unmarshal(ids, Optional[List[str]]), + remote_ids=utils.unmarshal(remote_ids, Optional[List[str]]), + legal_entity_ids=utils.unmarshal(legal_entity_ids, Optional[List[str]]), + ) + + req = self._build_request( + method="GET", + path="/hris/pay-runs", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=models.GetHrisPayRunsGlobals( + integration_id=self.sdk_configuration.globals.integration_id, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["429", "500", "502", "503", "504"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="GetHrisPayRuns", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + tags=["Unified HRIS API"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: not utils.match_status_codes(["200"], c), + retry_config=retry_config, + ) + + def next_func() -> Optional[models.GetHrisPayRunsResponse]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + next_cursor = JSONPath("$.data.next").parse(body) + + if len(next_cursor) == 0: + return None + + next_cursor = next_cursor[0] + if next_cursor is None or str(next_cursor).strip() == "": + return None + + return self.get_hris_pay_runs( + cursor=next_cursor, + page_size=page_size, + updated_after=updated_after, + include_deleted=include_deleted, + ignore_unsupported_filters=ignore_unsupported_filters, + ids=ids, + remote_ids=remote_ids, + legal_entity_ids=legal_entity_ids, + retries=retries, + server_url=server_url, + timeout_ms=timeout_ms, + http_headers=http_headers, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return models.GetHrisPayRunsResponse( + result=unmarshal_json_response( + models.GetHrisPayRunsPositiveResponse, http_res + ), + next=next_func, + ) + if utils.match_response(http_res, "default", "application/json"): + response_data = unmarshal_json_response(errors.KomboHrisErrorData, http_res) + raise errors.KomboHrisError(response_data, http_res) + + raise errors.SDKDefaultError("Unexpected response received", http_res) + + async def get_hris_pay_runs_async( + self, + *, + cursor: Optional[str] = None, + page_size: Optional[int] = 100, + updated_after: Optional[datetime] = None, + include_deleted: Optional[bool] = False, + ignore_unsupported_filters: Optional[bool] = False, + ids: Optional[Iterable[str]] = None, + remote_ids: Optional[Iterable[str]] = None, + legal_entity_ids: Optional[Iterable[str]] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.GetHrisPayRunsResponse]: + r"""Pay Runs + + Retrieve all pay runs for all legal entities, across all time. + + A pay run represents one payroll cycle for a legal entity, covering a single pay period and grouping the payslips paid out through it. Use this endpoint to reconcile payroll periods and read the totals paid out across each run. Filter by `legal_entity_ids` to scope the results to specific legal entities. + + Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: `(id IN ids) AND (remote_id IN remote_ids)` + + :param cursor: An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response. + :param page_size: The number of results to return per page. Maximum is 250. + :param updated_after: Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged. + + If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden. + + For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior). + + For this endpoint, only changes to the returned record itself are considered. + :param include_deleted: By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too. + :param ignore_unsupported_filters: When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. + :param ids: Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`. + :param remote_ids: Filter by a comma-separated list of remote IDs. + :param legal_entity_ids: Filter by a comma-separated list of legal entity IDs. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.GetHrisPayRunsRequest( + cursor=cursor, + page_size=page_size, + updated_after=updated_after, + include_deleted=include_deleted, + ignore_unsupported_filters=ignore_unsupported_filters, + ids=utils.unmarshal(ids, Optional[List[str]]), + remote_ids=utils.unmarshal(remote_ids, Optional[List[str]]), + legal_entity_ids=utils.unmarshal(legal_entity_ids, Optional[List[str]]), + ) + + req = self._build_request_async( + method="GET", + path="/hris/pay-runs", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=models.GetHrisPayRunsGlobals( + integration_id=self.sdk_configuration.globals.integration_id, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["429", "500", "502", "503", "504"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="GetHrisPayRuns", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + tags=["Unified HRIS API"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: not utils.match_status_codes(["200"], c), + retry_config=retry_config, + ) + + def next_func() -> Awaitable[Optional[models.GetHrisPayRunsResponse]]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + async def empty_result(): + return None + + next_cursor = JSONPath("$.data.next").parse(body) + + if len(next_cursor) == 0: + return empty_result() + + next_cursor = next_cursor[0] + if next_cursor is None or str(next_cursor).strip() == "": + return empty_result() + + return self.get_hris_pay_runs_async( + cursor=next_cursor, + page_size=page_size, + updated_after=updated_after, + include_deleted=include_deleted, + ignore_unsupported_filters=ignore_unsupported_filters, + ids=ids, + remote_ids=remote_ids, + legal_entity_ids=legal_entity_ids, + retries=retries, + server_url=server_url, + timeout_ms=timeout_ms, + http_headers=http_headers, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return models.GetHrisPayRunsResponse( + result=unmarshal_json_response( + models.GetHrisPayRunsPositiveResponse, http_res + ), + next=next_func, + ) + if utils.match_response(http_res, "default", "application/json"): + response_data = unmarshal_json_response(errors.KomboHrisErrorData, http_res) + raise errors.KomboHrisError(response_data, http_res) + + raise errors.SDKDefaultError("Unexpected response received", http_res) + + def get_hris_payslips( + self, + *, + cursor: Optional[str] = None, + page_size: Optional[int] = 100, + updated_after: Optional[datetime] = None, + include_deleted: Optional[bool] = False, + ignore_unsupported_filters: Optional[bool] = False, + ids: Optional[Iterable[str]] = None, + remote_ids: Optional[Iterable[str]] = None, + legal_entity_ids: Optional[Iterable[str]] = None, + employee_ids: Optional[Iterable[str]] = None, + payrun_ids: Optional[Iterable[str]] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.GetHrisPayslipsResponse]: + r"""Payslips + + Retrieve all payslips for all employees, across all time. + + A payslip is the individual pay statement an employee receives for one pay run, detailing what they were paid. Each payslip embeds the `employee` it belongs to and the `pay_run` it was paid out through, its `totals`, and the `line_items` that make it up (earnings, deductions, and contributions). Filter by `employee_ids`, `payrun_ids`, or `legal_entity_ids` to narrow the results. + + Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: `(id IN ids) AND (remote_id IN remote_ids)` + + :param cursor: An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response. + :param page_size: The number of results to return per page. Maximum is 250. + :param updated_after: Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged. + + If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden. + + For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior). + + For this endpoint, `updated_after` matches when the returned record changed, or when related data changed as described below. + + | Path | Added/Removed | Linked Record | + | --- | --- | --- | + | `employee` | ✗ No | ✗ No | + | `pay_run` | ✗ No | ✗ No | + | `line_items` | ✓ Yes | ✓ Yes | + | `line_items` → `salary_type` | ✗ No | ✗ No | + + _**Added/Removed**: Whether adding or removing entries from this list triggers an update (n/a for single records). **Linked Record**: Whether changes to the linked record itself trigger an update._ + :param include_deleted: By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too. + :param ignore_unsupported_filters: When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. + :param ids: Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`. + :param remote_ids: Filter by a comma-separated list of remote IDs. + :param legal_entity_ids: Filter by a comma-separated list of legal entity IDs. + :param employee_ids: Filter by a comma-separated list of employee IDs. + :param payrun_ids: Filter by a comma-separated list of payrun IDs. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.GetHrisPayslipsRequest( + cursor=cursor, + page_size=page_size, + updated_after=updated_after, + include_deleted=include_deleted, + ignore_unsupported_filters=ignore_unsupported_filters, + ids=utils.unmarshal(ids, Optional[List[str]]), + remote_ids=utils.unmarshal(remote_ids, Optional[List[str]]), + legal_entity_ids=utils.unmarshal(legal_entity_ids, Optional[List[str]]), + employee_ids=utils.unmarshal(employee_ids, Optional[List[str]]), + payrun_ids=utils.unmarshal(payrun_ids, Optional[List[str]]), + ) + + req = self._build_request( + method="GET", + path="/hris/payslips", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=models.GetHrisPayslipsGlobals( + integration_id=self.sdk_configuration.globals.integration_id, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["429", "500", "502", "503", "504"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="GetHrisPayslips", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + tags=["Unified HRIS API"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: not utils.match_status_codes(["200"], c), + retry_config=retry_config, + ) + + def next_func() -> Optional[models.GetHrisPayslipsResponse]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + next_cursor = JSONPath("$.data.next").parse(body) + + if len(next_cursor) == 0: + return None + + next_cursor = next_cursor[0] + if next_cursor is None or str(next_cursor).strip() == "": + return None + + return self.get_hris_payslips( + cursor=next_cursor, + page_size=page_size, + updated_after=updated_after, + include_deleted=include_deleted, + ignore_unsupported_filters=ignore_unsupported_filters, + ids=ids, + remote_ids=remote_ids, + legal_entity_ids=legal_entity_ids, + employee_ids=employee_ids, + payrun_ids=payrun_ids, + retries=retries, + server_url=server_url, + timeout_ms=timeout_ms, + http_headers=http_headers, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return models.GetHrisPayslipsResponse( + result=unmarshal_json_response( + models.GetHrisPayslipsPositiveResponse, http_res + ), + next=next_func, + ) + if utils.match_response(http_res, "default", "application/json"): + response_data = unmarshal_json_response(errors.KomboHrisErrorData, http_res) + raise errors.KomboHrisError(response_data, http_res) + + raise errors.SDKDefaultError("Unexpected response received", http_res) + + async def get_hris_payslips_async( + self, + *, + cursor: Optional[str] = None, + page_size: Optional[int] = 100, + updated_after: Optional[datetime] = None, + include_deleted: Optional[bool] = False, + ignore_unsupported_filters: Optional[bool] = False, + ids: Optional[Iterable[str]] = None, + remote_ids: Optional[Iterable[str]] = None, + legal_entity_ids: Optional[Iterable[str]] = None, + employee_ids: Optional[Iterable[str]] = None, + payrun_ids: Optional[Iterable[str]] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> Optional[models.GetHrisPayslipsResponse]: + r"""Payslips + + Retrieve all payslips for all employees, across all time. + + A payslip is the individual pay statement an employee receives for one pay run, detailing what they were paid. Each payslip embeds the `employee` it belongs to and the `pay_run` it was paid out through, its `totals`, and the `line_items` that make it up (earnings, deductions, and contributions). Filter by `employee_ids`, `payrun_ids`, or `legal_entity_ids` to narrow the results. + + Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: `(id IN ids) AND (remote_id IN remote_ids)` + + :param cursor: An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response. + :param page_size: The number of results to return per page. Maximum is 250. + :param updated_after: Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged. + + If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden. + + For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior). + + For this endpoint, `updated_after` matches when the returned record changed, or when related data changed as described below. + + | Path | Added/Removed | Linked Record | + | --- | --- | --- | + | `employee` | ✗ No | ✗ No | + | `pay_run` | ✗ No | ✗ No | + | `line_items` | ✓ Yes | ✓ Yes | + | `line_items` → `salary_type` | ✗ No | ✗ No | + + _**Added/Removed**: Whether adding or removing entries from this list triggers an update (n/a for single records). **Linked Record**: Whether changes to the linked record itself trigger an update._ + :param include_deleted: By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too. + :param ignore_unsupported_filters: When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. + :param ids: Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`. + :param remote_ids: Filter by a comma-separated list of remote IDs. + :param legal_entity_ids: Filter by a comma-separated list of legal entity IDs. + :param employee_ids: Filter by a comma-separated list of employee IDs. + :param payrun_ids: Filter by a comma-separated list of payrun IDs. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.GetHrisPayslipsRequest( + cursor=cursor, + page_size=page_size, + updated_after=updated_after, + include_deleted=include_deleted, + ignore_unsupported_filters=ignore_unsupported_filters, + ids=utils.unmarshal(ids, Optional[List[str]]), + remote_ids=utils.unmarshal(remote_ids, Optional[List[str]]), + legal_entity_ids=utils.unmarshal(legal_entity_ids, Optional[List[str]]), + employee_ids=utils.unmarshal(employee_ids, Optional[List[str]]), + payrun_ids=utils.unmarshal(payrun_ids, Optional[List[str]]), + ) + + req = self._build_request_async( + method="GET", + path="/hris/payslips", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + _globals=models.GetHrisPayslipsGlobals( + integration_id=self.sdk_configuration.globals.integration_id, + ), + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["429", "500", "502", "503", "504"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="GetHrisPayslips", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + tags=["Unified HRIS API"], + extensions=None, + ), + request=req, + is_error_status_code=lambda c: not utils.match_status_codes(["200"], c), + retry_config=retry_config, + ) + + def next_func() -> Awaitable[Optional[models.GetHrisPayslipsResponse]]: + body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]]) + + async def empty_result(): + return None + + next_cursor = JSONPath("$.data.next").parse(body) + + if len(next_cursor) == 0: + return empty_result() + + next_cursor = next_cursor[0] + if next_cursor is None or str(next_cursor).strip() == "": + return empty_result() + + return self.get_hris_payslips_async( + cursor=next_cursor, + page_size=page_size, + updated_after=updated_after, + include_deleted=include_deleted, + ignore_unsupported_filters=ignore_unsupported_filters, + ids=ids, + remote_ids=remote_ids, + legal_entity_ids=legal_entity_ids, + employee_ids=employee_ids, + payrun_ids=payrun_ids, + retries=retries, + server_url=server_url, + timeout_ms=timeout_ms, + http_headers=http_headers, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return models.GetHrisPayslipsResponse( + result=unmarshal_json_response( + models.GetHrisPayslipsPositiveResponse, http_res + ), + next=next_func, + ) + if utils.match_response(http_res, "default", "application/json"): + response_data = unmarshal_json_response(errors.KomboHrisErrorData, http_res) + raise errors.KomboHrisError(response_data, http_res) + + raise errors.SDKDefaultError("Unexpected response received", http_res) diff --git a/src/kombo/models/__init__.py b/src/kombo/models/__init__.py index 766586d..0481442 100644 --- a/src/kombo/models/__init__.py +++ b/src/kombo/models/__init__.py @@ -496,6 +496,10 @@ GetAtsJobsPositiveResponseHiringTeamTypedDict, GetAtsJobsPositiveResponseLocation, GetAtsJobsPositiveResponseLocationTypedDict, + GetAtsJobsPositiveResponseOption1, + GetAtsJobsPositiveResponseOption1TypedDict, + GetAtsJobsPositiveResponseOption2, + GetAtsJobsPositiveResponseOption2TypedDict, GetAtsJobsPositiveResponseResult, GetAtsJobsPositiveResponseResultTypedDict, GetAtsJobsPositiveResponseScope, @@ -509,10 +513,6 @@ JobPostingVisibility, JobRole, JobRoleTypedDict, - Option1, - Option1TypedDict, - Option2, - Option2TypedDict, PreconditionOptions, PreconditionOptionsTypedDict, RemoteWorkStatus, @@ -532,9 +532,9 @@ GetAtsNotesResponseTypedDict, ) from .getatsnotespositiveresponse import ( - Author, - AuthorTypedDict, GetAtsNotesPositiveResponse, + GetAtsNotesPositiveResponseAuthor, + GetAtsNotesPositiveResponseAuthorTypedDict, GetAtsNotesPositiveResponseData, GetAtsNotesPositiveResponseDataTypedDict, GetAtsNotesPositiveResponseResult, @@ -600,6 +600,46 @@ GetAtsRolesPositiveResponseTypedDict, GetAtsRolesPositiveResponseUnifiedType, ) + from .getatsscorecardsop import ( + GetAtsScorecardsGlobals, + GetAtsScorecardsGlobalsTypedDict, + GetAtsScorecardsRequest, + GetAtsScorecardsRequestTypedDict, + GetAtsScorecardsResponse, + GetAtsScorecardsResponseTypedDict, + ) + from .getatsscorecardspositiveresponse import ( + GetAtsScorecardsPositiveResponse, + GetAtsScorecardsPositiveResponseAnswer1, + GetAtsScorecardsPositiveResponseAnswer1TypedDict, + GetAtsScorecardsPositiveResponseAnswer2, + GetAtsScorecardsPositiveResponseAnswer2TypedDict, + GetAtsScorecardsPositiveResponseAuthor, + GetAtsScorecardsPositiveResponseAuthorTypedDict, + GetAtsScorecardsPositiveResponseData, + GetAtsScorecardsPositiveResponseDataTypedDict, + GetAtsScorecardsPositiveResponseOption1, + GetAtsScorecardsPositiveResponseOption1TypedDict, + GetAtsScorecardsPositiveResponseOption2, + GetAtsScorecardsPositiveResponseOption2TypedDict, + GetAtsScorecardsPositiveResponseResult, + GetAtsScorecardsPositiveResponseResultTypedDict, + GetAtsScorecardsPositiveResponseTypedDict, + Response, + ResponseTypedDict, + ResultBoolean, + ResultBooleanTypedDict, + ResultDate, + ResultDateTypedDict, + ResultMultiSelect, + ResultMultiSelectTypedDict, + ResultNumber, + ResultNumberTypedDict, + ResultSingleSelect, + ResultSingleSelectTypedDict, + ResultText, + ResultTextTypedDict, + ) from .getatstagsop import ( GetAtsTagsGlobals, GetAtsTagsGlobalsTypedDict, @@ -895,6 +935,62 @@ GetHrisLocationsPositiveResponseResultTypedDict, GetHrisLocationsPositiveResponseTypedDict, ) + from .gethrispayrunsop import ( + GetHrisPayRunsGlobals, + GetHrisPayRunsGlobalsTypedDict, + GetHrisPayRunsRequest, + GetHrisPayRunsRequestTypedDict, + GetHrisPayRunsResponse, + GetHrisPayRunsResponseTypedDict, + ) + from .gethrispayrunspositiveresponse import ( + GetHrisPayRunsPositiveResponse, + GetHrisPayRunsPositiveResponseData, + GetHrisPayRunsPositiveResponseDataTypedDict, + GetHrisPayRunsPositiveResponseGrossPay, + GetHrisPayRunsPositiveResponseGrossPayTypedDict, + GetHrisPayRunsPositiveResponseNetPay, + GetHrisPayRunsPositiveResponseNetPayTypedDict, + GetHrisPayRunsPositiveResponsePaidAmount, + GetHrisPayRunsPositiveResponsePaidAmountTypedDict, + GetHrisPayRunsPositiveResponseResult, + GetHrisPayRunsPositiveResponseResultTypedDict, + GetHrisPayRunsPositiveResponseTotals, + GetHrisPayRunsPositiveResponseTotalsTypedDict, + GetHrisPayRunsPositiveResponseTypedDict, + ) + from .gethrispayslipsop import ( + GetHrisPayslipsGlobals, + GetHrisPayslipsGlobalsTypedDict, + GetHrisPayslipsRequest, + GetHrisPayslipsRequestTypedDict, + GetHrisPayslipsResponse, + GetHrisPayslipsResponseTypedDict, + ) + from .gethrispayslipspositiveresponse import ( + Amount, + AmountTypedDict, + Employee, + EmployeeTypedDict, + GetHrisPayslipsPositiveResponse, + GetHrisPayslipsPositiveResponseData, + GetHrisPayslipsPositiveResponseDataTypedDict, + GetHrisPayslipsPositiveResponseGrossPay, + GetHrisPayslipsPositiveResponseGrossPayTypedDict, + GetHrisPayslipsPositiveResponseNetPay, + GetHrisPayslipsPositiveResponseNetPayTypedDict, + GetHrisPayslipsPositiveResponsePaidAmount, + GetHrisPayslipsPositiveResponsePaidAmountTypedDict, + GetHrisPayslipsPositiveResponseResult, + GetHrisPayslipsPositiveResponseResultTypedDict, + GetHrisPayslipsPositiveResponseTotals, + GetHrisPayslipsPositiveResponseTotalsTypedDict, + GetHrisPayslipsPositiveResponseTypedDict, + LineItem, + LineItemTypedDict, + PayRun, + PayRunTypedDict, + ) from .gethrisperformancereviewcyclesop import ( GetHrisPerformanceReviewCyclesGlobals, GetHrisPerformanceReviewCyclesGlobalsTypedDict, @@ -1175,6 +1271,22 @@ QaStatus, State, ) + from .issuestatuschangedwebhookpayload import ( + Change, + Integration, + IntegrationTypedDict, + Issue, + IssueStatusChangedWebhookPayload, + IssueStatusChangedWebhookPayloadCategory, + IssueStatusChangedWebhookPayloadData, + IssueStatusChangedWebhookPayloadDataTypedDict, + IssueStatusChangedWebhookPayloadEndUser, + IssueStatusChangedWebhookPayloadEndUserTypedDict, + IssueStatusChangedWebhookPayloadStatus, + IssueStatusChangedWebhookPayloadType, + IssueStatusChangedWebhookPayloadTypedDict, + IssueTypedDict, + ) from .komboatserror import ( KomboAtsErrorCode, KomboAtsErrorError, @@ -2255,6 +2367,10 @@ WebhookIntegrationStateChangedWebhookPayloadRequest, WebhookIntegrationStateChangedWebhookPayloadRequestTypedDict, ) + from .webhookissuestatuschangedwebhookpayloadop import ( + WebhookIssueStatusChangedWebhookPayloadRequest, + WebhookIssueStatusChangedWebhookPayloadRequestTypedDict, + ) from .webhooksyncfinishedwebhookpayloadop import ( WebhookSyncFinishedWebhookPayloadRequest, WebhookSyncFinishedWebhookPayloadRequestTypedDict, @@ -2271,6 +2387,8 @@ "A3innuvanominaTypedDict", "Afas", "AfasTypedDict", + "Amount", + "AmountTypedDict", "AssessCandidateData", "AssessCandidateDataTypedDict", "AssessCandidateTestResultData", @@ -2303,8 +2421,6 @@ "AttributeText", "AttributeTextTypedDict", "AttributeTypedDict", - "Author", - "AuthorTypedDict", "BankAccount", "BankAccountTypedDict", "BenefitTypeID", @@ -2312,6 +2428,7 @@ "BreakTypedDict", "CandidateAssessmentData", "CandidateAssessmentDataTypedDict", + "Change", "ChangedModel", "ChangedModelTypedDict", "ConnectionFlowFailedWebhookPayload", @@ -2388,6 +2505,8 @@ "DomesticBankRouting", "DomesticBankRoutingType", "DomesticBankRoutingTypedDict", + "Employee", + "EmployeeTypedDict", "Employment", "EmploymentEmploymentType", "EmploymentStatus", @@ -2634,6 +2753,10 @@ "GetAtsJobsPositiveResponseHiringTeamTypedDict", "GetAtsJobsPositiveResponseLocation", "GetAtsJobsPositiveResponseLocationTypedDict", + "GetAtsJobsPositiveResponseOption1", + "GetAtsJobsPositiveResponseOption1TypedDict", + "GetAtsJobsPositiveResponseOption2", + "GetAtsJobsPositiveResponseOption2TypedDict", "GetAtsJobsPositiveResponseResult", "GetAtsJobsPositiveResponseResultTypedDict", "GetAtsJobsPositiveResponseScope", @@ -2648,6 +2771,8 @@ "GetAtsNotesGlobals", "GetAtsNotesGlobalsTypedDict", "GetAtsNotesPositiveResponse", + "GetAtsNotesPositiveResponseAuthor", + "GetAtsNotesPositiveResponseAuthorTypedDict", "GetAtsNotesPositiveResponseData", "GetAtsNotesPositiveResponseDataTypedDict", "GetAtsNotesPositiveResponseResult", @@ -2704,6 +2829,28 @@ "GetAtsRolesRequestTypedDict", "GetAtsRolesResponse", "GetAtsRolesResponseTypedDict", + "GetAtsScorecardsGlobals", + "GetAtsScorecardsGlobalsTypedDict", + "GetAtsScorecardsPositiveResponse", + "GetAtsScorecardsPositiveResponseAnswer1", + "GetAtsScorecardsPositiveResponseAnswer1TypedDict", + "GetAtsScorecardsPositiveResponseAnswer2", + "GetAtsScorecardsPositiveResponseAnswer2TypedDict", + "GetAtsScorecardsPositiveResponseAuthor", + "GetAtsScorecardsPositiveResponseAuthorTypedDict", + "GetAtsScorecardsPositiveResponseData", + "GetAtsScorecardsPositiveResponseDataTypedDict", + "GetAtsScorecardsPositiveResponseOption1", + "GetAtsScorecardsPositiveResponseOption1TypedDict", + "GetAtsScorecardsPositiveResponseOption2", + "GetAtsScorecardsPositiveResponseOption2TypedDict", + "GetAtsScorecardsPositiveResponseResult", + "GetAtsScorecardsPositiveResponseResultTypedDict", + "GetAtsScorecardsPositiveResponseTypedDict", + "GetAtsScorecardsRequest", + "GetAtsScorecardsRequestTypedDict", + "GetAtsScorecardsResponse", + "GetAtsScorecardsResponseTypedDict", "GetAtsTagsGlobals", "GetAtsTagsGlobalsTypedDict", "GetAtsTagsPositiveResponse", @@ -2903,6 +3050,46 @@ "GetHrisLocationsRequestTypedDict", "GetHrisLocationsResponse", "GetHrisLocationsResponseTypedDict", + "GetHrisPayRunsGlobals", + "GetHrisPayRunsGlobalsTypedDict", + "GetHrisPayRunsPositiveResponse", + "GetHrisPayRunsPositiveResponseData", + "GetHrisPayRunsPositiveResponseDataTypedDict", + "GetHrisPayRunsPositiveResponseGrossPay", + "GetHrisPayRunsPositiveResponseGrossPayTypedDict", + "GetHrisPayRunsPositiveResponseNetPay", + "GetHrisPayRunsPositiveResponseNetPayTypedDict", + "GetHrisPayRunsPositiveResponsePaidAmount", + "GetHrisPayRunsPositiveResponsePaidAmountTypedDict", + "GetHrisPayRunsPositiveResponseResult", + "GetHrisPayRunsPositiveResponseResultTypedDict", + "GetHrisPayRunsPositiveResponseTotals", + "GetHrisPayRunsPositiveResponseTotalsTypedDict", + "GetHrisPayRunsPositiveResponseTypedDict", + "GetHrisPayRunsRequest", + "GetHrisPayRunsRequestTypedDict", + "GetHrisPayRunsResponse", + "GetHrisPayRunsResponseTypedDict", + "GetHrisPayslipsGlobals", + "GetHrisPayslipsGlobalsTypedDict", + "GetHrisPayslipsPositiveResponse", + "GetHrisPayslipsPositiveResponseData", + "GetHrisPayslipsPositiveResponseDataTypedDict", + "GetHrisPayslipsPositiveResponseGrossPay", + "GetHrisPayslipsPositiveResponseGrossPayTypedDict", + "GetHrisPayslipsPositiveResponseNetPay", + "GetHrisPayslipsPositiveResponseNetPayTypedDict", + "GetHrisPayslipsPositiveResponsePaidAmount", + "GetHrisPayslipsPositiveResponsePaidAmountTypedDict", + "GetHrisPayslipsPositiveResponseResult", + "GetHrisPayslipsPositiveResponseResultTypedDict", + "GetHrisPayslipsPositiveResponseTotals", + "GetHrisPayslipsPositiveResponseTotalsTypedDict", + "GetHrisPayslipsPositiveResponseTypedDict", + "GetHrisPayslipsRequest", + "GetHrisPayslipsRequestTypedDict", + "GetHrisPayslipsResponse", + "GetHrisPayslipsResponseTypedDict", "GetHrisPerformanceReviewCyclesGlobals", "GetHrisPerformanceReviewCyclesGlobalsTypedDict", "GetHrisPerformanceReviewCyclesPositiveResponse", @@ -3073,6 +3260,7 @@ "InlineAssessmentOrderReceivedWebhookPayloadStatus", "InlineAssessmentOrderReceivedWebhookPayloadType", "InlineAssessmentOrderReceivedWebhookPayloadTypedDict", + "Integration", "IntegrationCreatedWebhookPayload", "IntegrationCreatedWebhookPayloadCategory", "IntegrationCreatedWebhookPayloadData", @@ -3099,8 +3287,20 @@ "IntegrationStateChangedWebhookPayloadType", "IntegrationStateChangedWebhookPayloadTypedDict", "IntegrationTool", + "IntegrationTypedDict", "Interview", "InterviewTypedDict", + "Issue", + "IssueStatusChangedWebhookPayload", + "IssueStatusChangedWebhookPayloadCategory", + "IssueStatusChangedWebhookPayloadData", + "IssueStatusChangedWebhookPayloadDataTypedDict", + "IssueStatusChangedWebhookPayloadEndUser", + "IssueStatusChangedWebhookPayloadEndUserTypedDict", + "IssueStatusChangedWebhookPayloadStatus", + "IssueStatusChangedWebhookPayloadType", + "IssueStatusChangedWebhookPayloadTypedDict", + "IssueTypedDict", "JobPosting", "JobPostingStatus", "JobPostingTypedDict", @@ -3121,6 +3321,8 @@ "KomboHrisErrorStatus", "LegalEntityAddress", "LegalEntityAddressTypedDict", + "LineItem", + "LineItemTypedDict", "Manager", "ManagerEmploymentStatus", "ManagerTypedDict", @@ -3133,10 +3335,6 @@ "Offer", "OfferStatus", "OfferTypedDict", - "Option1", - "Option1TypedDict", - "Option2", - "Option2TypedDict", "OrderedOption", "OrderedOptionTypedDict", "PatchIntegrationsIntegrationIDIntegrationFieldsIntegrationFieldIDPositiveResponse", @@ -3148,6 +3346,8 @@ "PatchIntegrationsIntegrationIDIntegrationFieldsIntegrationFieldIDRequestBody", "PatchIntegrationsIntegrationIDIntegrationFieldsIntegrationFieldIDRequestBodyTypedDict", "PatchIntegrationsIntegrationIDIntegrationFieldsIntegrationFieldIDRequestTypedDict", + "PayRun", + "PayRunTypedDict", "PostAtsApplicationsApplicationIDAttachmentsGlobals", "PostAtsApplicationsApplicationIDAttachmentsGlobalsTypedDict", "PostAtsApplicationsApplicationIDAttachmentsPositiveResponse", @@ -4015,6 +4215,20 @@ "QaStatus", "ReadModelScopeConfigSetting", "RemoteWorkStatus", + "Response", + "ResponseTypedDict", + "ResultBoolean", + "ResultBooleanTypedDict", + "ResultDate", + "ResultDateTypedDict", + "ResultMultiSelect", + "ResultMultiSelectTypedDict", + "ResultNumber", + "ResultNumberTypedDict", + "ResultSingleSelect", + "ResultSingleSelectTypedDict", + "ResultText", + "ResultTextTypedDict", "ReviewCycle", "ReviewCycleTypedDict", "Reviewee", @@ -4179,6 +4393,8 @@ "WebhookIntegrationDeletedWebhookPayloadRequestTypedDict", "WebhookIntegrationStateChangedWebhookPayloadRequest", "WebhookIntegrationStateChangedWebhookPayloadRequestTypedDict", + "WebhookIssueStatusChangedWebhookPayloadRequest", + "WebhookIssueStatusChangedWebhookPayloadRequestTypedDict", "WebhookSyncFinishedWebhookPayloadRequest", "WebhookSyncFinishedWebhookPayloadRequestTypedDict", "WorkLocation", @@ -4517,6 +4733,10 @@ "GetAtsJobsPositiveResponseHiringTeamTypedDict": ".getatsjobspositiveresponse", "GetAtsJobsPositiveResponseLocation": ".getatsjobspositiveresponse", "GetAtsJobsPositiveResponseLocationTypedDict": ".getatsjobspositiveresponse", + "GetAtsJobsPositiveResponseOption1": ".getatsjobspositiveresponse", + "GetAtsJobsPositiveResponseOption1TypedDict": ".getatsjobspositiveresponse", + "GetAtsJobsPositiveResponseOption2": ".getatsjobspositiveresponse", + "GetAtsJobsPositiveResponseOption2TypedDict": ".getatsjobspositiveresponse", "GetAtsJobsPositiveResponseResult": ".getatsjobspositiveresponse", "GetAtsJobsPositiveResponseResultTypedDict": ".getatsjobspositiveresponse", "GetAtsJobsPositiveResponseScope": ".getatsjobspositiveresponse", @@ -4530,10 +4750,6 @@ "JobPostingVisibility": ".getatsjobspositiveresponse", "JobRole": ".getatsjobspositiveresponse", "JobRoleTypedDict": ".getatsjobspositiveresponse", - "Option1": ".getatsjobspositiveresponse", - "Option1TypedDict": ".getatsjobspositiveresponse", - "Option2": ".getatsjobspositiveresponse", - "Option2TypedDict": ".getatsjobspositiveresponse", "PreconditionOptions": ".getatsjobspositiveresponse", "PreconditionOptionsTypedDict": ".getatsjobspositiveresponse", "RemoteWorkStatus": ".getatsjobspositiveresponse", @@ -4549,9 +4765,9 @@ "GetAtsNotesRequestTypedDict": ".getatsnotesop", "GetAtsNotesResponse": ".getatsnotesop", "GetAtsNotesResponseTypedDict": ".getatsnotesop", - "Author": ".getatsnotespositiveresponse", - "AuthorTypedDict": ".getatsnotespositiveresponse", "GetAtsNotesPositiveResponse": ".getatsnotespositiveresponse", + "GetAtsNotesPositiveResponseAuthor": ".getatsnotespositiveresponse", + "GetAtsNotesPositiveResponseAuthorTypedDict": ".getatsnotespositiveresponse", "GetAtsNotesPositiveResponseData": ".getatsnotespositiveresponse", "GetAtsNotesPositiveResponseDataTypedDict": ".getatsnotespositiveresponse", "GetAtsNotesPositiveResponseResult": ".getatsnotespositiveresponse", @@ -4604,6 +4820,42 @@ "GetAtsRolesPositiveResponseScope": ".getatsrolespositiveresponse", "GetAtsRolesPositiveResponseTypedDict": ".getatsrolespositiveresponse", "GetAtsRolesPositiveResponseUnifiedType": ".getatsrolespositiveresponse", + "GetAtsScorecardsGlobals": ".getatsscorecardsop", + "GetAtsScorecardsGlobalsTypedDict": ".getatsscorecardsop", + "GetAtsScorecardsRequest": ".getatsscorecardsop", + "GetAtsScorecardsRequestTypedDict": ".getatsscorecardsop", + "GetAtsScorecardsResponse": ".getatsscorecardsop", + "GetAtsScorecardsResponseTypedDict": ".getatsscorecardsop", + "GetAtsScorecardsPositiveResponse": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseAnswer1": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseAnswer1TypedDict": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseAnswer2": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseAnswer2TypedDict": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseAuthor": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseAuthorTypedDict": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseData": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseDataTypedDict": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseOption1": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseOption1TypedDict": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseOption2": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseOption2TypedDict": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseResult": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseResultTypedDict": ".getatsscorecardspositiveresponse", + "GetAtsScorecardsPositiveResponseTypedDict": ".getatsscorecardspositiveresponse", + "Response": ".getatsscorecardspositiveresponse", + "ResponseTypedDict": ".getatsscorecardspositiveresponse", + "ResultBoolean": ".getatsscorecardspositiveresponse", + "ResultBooleanTypedDict": ".getatsscorecardspositiveresponse", + "ResultDate": ".getatsscorecardspositiveresponse", + "ResultDateTypedDict": ".getatsscorecardspositiveresponse", + "ResultMultiSelect": ".getatsscorecardspositiveresponse", + "ResultMultiSelectTypedDict": ".getatsscorecardspositiveresponse", + "ResultNumber": ".getatsscorecardspositiveresponse", + "ResultNumberTypedDict": ".getatsscorecardspositiveresponse", + "ResultSingleSelect": ".getatsscorecardspositiveresponse", + "ResultSingleSelectTypedDict": ".getatsscorecardspositiveresponse", + "ResultText": ".getatsscorecardspositiveresponse", + "ResultTextTypedDict": ".getatsscorecardspositiveresponse", "GetAtsTagsGlobals": ".getatstagsop", "GetAtsTagsGlobalsTypedDict": ".getatstagsop", "GetAtsTagsRequest": ".getatstagsop", @@ -4849,6 +5101,54 @@ "GetHrisLocationsPositiveResponseResult": ".gethrislocationspositiveresponse", "GetHrisLocationsPositiveResponseResultTypedDict": ".gethrislocationspositiveresponse", "GetHrisLocationsPositiveResponseTypedDict": ".gethrislocationspositiveresponse", + "GetHrisPayRunsGlobals": ".gethrispayrunsop", + "GetHrisPayRunsGlobalsTypedDict": ".gethrispayrunsop", + "GetHrisPayRunsRequest": ".gethrispayrunsop", + "GetHrisPayRunsRequestTypedDict": ".gethrispayrunsop", + "GetHrisPayRunsResponse": ".gethrispayrunsop", + "GetHrisPayRunsResponseTypedDict": ".gethrispayrunsop", + "GetHrisPayRunsPositiveResponse": ".gethrispayrunspositiveresponse", + "GetHrisPayRunsPositiveResponseData": ".gethrispayrunspositiveresponse", + "GetHrisPayRunsPositiveResponseDataTypedDict": ".gethrispayrunspositiveresponse", + "GetHrisPayRunsPositiveResponseGrossPay": ".gethrispayrunspositiveresponse", + "GetHrisPayRunsPositiveResponseGrossPayTypedDict": ".gethrispayrunspositiveresponse", + "GetHrisPayRunsPositiveResponseNetPay": ".gethrispayrunspositiveresponse", + "GetHrisPayRunsPositiveResponseNetPayTypedDict": ".gethrispayrunspositiveresponse", + "GetHrisPayRunsPositiveResponsePaidAmount": ".gethrispayrunspositiveresponse", + "GetHrisPayRunsPositiveResponsePaidAmountTypedDict": ".gethrispayrunspositiveresponse", + "GetHrisPayRunsPositiveResponseResult": ".gethrispayrunspositiveresponse", + "GetHrisPayRunsPositiveResponseResultTypedDict": ".gethrispayrunspositiveresponse", + "GetHrisPayRunsPositiveResponseTotals": ".gethrispayrunspositiveresponse", + "GetHrisPayRunsPositiveResponseTotalsTypedDict": ".gethrispayrunspositiveresponse", + "GetHrisPayRunsPositiveResponseTypedDict": ".gethrispayrunspositiveresponse", + "GetHrisPayslipsGlobals": ".gethrispayslipsop", + "GetHrisPayslipsGlobalsTypedDict": ".gethrispayslipsop", + "GetHrisPayslipsRequest": ".gethrispayslipsop", + "GetHrisPayslipsRequestTypedDict": ".gethrispayslipsop", + "GetHrisPayslipsResponse": ".gethrispayslipsop", + "GetHrisPayslipsResponseTypedDict": ".gethrispayslipsop", + "Amount": ".gethrispayslipspositiveresponse", + "AmountTypedDict": ".gethrispayslipspositiveresponse", + "Employee": ".gethrispayslipspositiveresponse", + "EmployeeTypedDict": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponse": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponseData": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponseDataTypedDict": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponseGrossPay": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponseGrossPayTypedDict": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponseNetPay": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponseNetPayTypedDict": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponsePaidAmount": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponsePaidAmountTypedDict": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponseResult": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponseResultTypedDict": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponseTotals": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponseTotalsTypedDict": ".gethrispayslipspositiveresponse", + "GetHrisPayslipsPositiveResponseTypedDict": ".gethrispayslipspositiveresponse", + "LineItem": ".gethrispayslipspositiveresponse", + "LineItemTypedDict": ".gethrispayslipspositiveresponse", + "PayRun": ".gethrispayslipspositiveresponse", + "PayRunTypedDict": ".gethrispayslipspositiveresponse", "GetHrisPerformanceReviewCyclesGlobals": ".gethrisperformancereviewcyclesop", "GetHrisPerformanceReviewCyclesGlobalsTypedDict": ".gethrisperformancereviewcyclesop", "GetHrisPerformanceReviewCyclesRequest": ".gethrisperformancereviewcyclesop", @@ -5085,6 +5385,20 @@ "IntegrationStateChangedWebhookPayloadTypedDict": ".integrationstatechangedwebhookpayload", "QaStatus": ".integrationstatechangedwebhookpayload", "State": ".integrationstatechangedwebhookpayload", + "Change": ".issuestatuschangedwebhookpayload", + "Integration": ".issuestatuschangedwebhookpayload", + "IntegrationTypedDict": ".issuestatuschangedwebhookpayload", + "Issue": ".issuestatuschangedwebhookpayload", + "IssueStatusChangedWebhookPayload": ".issuestatuschangedwebhookpayload", + "IssueStatusChangedWebhookPayloadCategory": ".issuestatuschangedwebhookpayload", + "IssueStatusChangedWebhookPayloadData": ".issuestatuschangedwebhookpayload", + "IssueStatusChangedWebhookPayloadDataTypedDict": ".issuestatuschangedwebhookpayload", + "IssueStatusChangedWebhookPayloadEndUser": ".issuestatuschangedwebhookpayload", + "IssueStatusChangedWebhookPayloadEndUserTypedDict": ".issuestatuschangedwebhookpayload", + "IssueStatusChangedWebhookPayloadStatus": ".issuestatuschangedwebhookpayload", + "IssueStatusChangedWebhookPayloadType": ".issuestatuschangedwebhookpayload", + "IssueStatusChangedWebhookPayloadTypedDict": ".issuestatuschangedwebhookpayload", + "IssueTypedDict": ".issuestatuschangedwebhookpayload", "KomboAtsErrorCode": ".komboatserror", "KomboAtsErrorError": ".komboatserror", "KomboAtsErrorErrorTypedDict": ".komboatserror", @@ -6006,6 +6320,8 @@ "WebhookIntegrationDeletedWebhookPayloadRequestTypedDict": ".webhookintegrationdeletedwebhookpayloadop", "WebhookIntegrationStateChangedWebhookPayloadRequest": ".webhookintegrationstatechangedwebhookpayloadop", "WebhookIntegrationStateChangedWebhookPayloadRequestTypedDict": ".webhookintegrationstatechangedwebhookpayloadop", + "WebhookIssueStatusChangedWebhookPayloadRequest": ".webhookissuestatuschangedwebhookpayloadop", + "WebhookIssueStatusChangedWebhookPayloadRequestTypedDict": ".webhookissuestatuschangedwebhookpayloadop", "WebhookSyncFinishedWebhookPayloadRequest": ".webhooksyncfinishedwebhookpayloadop", "WebhookSyncFinishedWebhookPayloadRequestTypedDict": ".webhooksyncfinishedwebhookpayloadop", } diff --git a/src/kombo/models/datachangedwebhookpayload.py b/src/kombo/models/datachangedwebhookpayload.py index c5212e6..20aad44 100644 --- a/src/kombo/models/datachangedwebhookpayload.py +++ b/src/kombo/models/datachangedwebhookpayload.py @@ -37,6 +37,10 @@ "hris_skills", "hris_skill_rating_providers", "hris_employee_skill_proficiency_ratings", + "hris_pay_runs", + "hris_payslips", + "hris_salary_types", + "hris_payslip_line_items", "ats_users", "ats_jobs", "ats_job_postings", @@ -50,6 +54,7 @@ "ats_rejection_reasons", "ats_roles", "ats_notes", + "ats_scorecards", "lms_users", "lms_course_providers", "lms_skills", diff --git a/src/kombo/models/getatsjobspositiveresponse.py b/src/kombo/models/getatsjobspositiveresponse.py index 0388b8c..e65ec63 100644 --- a/src/kombo/models/getatsjobspositiveresponse.py +++ b/src/kombo/models/getatsjobspositiveresponse.py @@ -257,7 +257,7 @@ class FormatInformation(BaseModel): r"""This is just a text block.""" -class Option2TypedDict(TypedDict): +class GetAtsJobsPositiveResponseOption2TypedDict(TypedDict): id: str r"""The Kombo ID of this question option. Use this ID to specify the answer to this question.""" name: str @@ -266,7 +266,7 @@ class Option2TypedDict(TypedDict): r"""ID in the connected ATS. This might be null as some systems only use the name to identify the option.""" -class Option2(BaseModel): +class GetAtsJobsPositiveResponseOption2(BaseModel): id: str r"""The Kombo ID of this question option. Use this ID to specify the answer to this question.""" @@ -303,12 +303,12 @@ def serialize_model(self, handler): class FormatMultiSelectTypedDict(TypedDict): - options: List[Option2TypedDict] + options: List[GetAtsJobsPositiveResponseOption2TypedDict] type: Literal["MULTI_SELECT"] class FormatMultiSelect(BaseModel): - options: List[Option2] + options: List[GetAtsJobsPositiveResponseOption2] TYPE: Annotated[ Annotated[ @@ -346,7 +346,7 @@ class FormatBoolean(BaseModel): ] -class Option1TypedDict(TypedDict): +class GetAtsJobsPositiveResponseOption1TypedDict(TypedDict): id: str r"""The Kombo ID of this question option. Use this ID to specify the answer to this question.""" name: str @@ -355,7 +355,7 @@ class Option1TypedDict(TypedDict): r"""ID in the connected ATS. This might be null as some systems only use the name to identify the option.""" -class Option1(BaseModel): +class GetAtsJobsPositiveResponseOption1(BaseModel): id: str r"""The Kombo ID of this question option. Use this ID to specify the answer to this question.""" @@ -392,13 +392,13 @@ def serialize_model(self, handler): class FormatSingleSelectTypedDict(TypedDict): - options: List[Option1TypedDict] + options: List[GetAtsJobsPositiveResponseOption1TypedDict] display_type: NotRequired[Nullable[DisplayType3]] type: Literal["SINGLE_SELECT"] class FormatSingleSelect(BaseModel): - options: List[Option1] + options: List[GetAtsJobsPositiveResponseOption1] display_type: OptionalNullable[DisplayType3] = UNSET diff --git a/src/kombo/models/getatsnotespositiveresponse.py b/src/kombo/models/getatsnotespositiveresponse.py index 9982d55..dc9be60 100644 --- a/src/kombo/models/getatsnotespositiveresponse.py +++ b/src/kombo/models/getatsnotespositiveresponse.py @@ -11,7 +11,7 @@ from typing_extensions import Annotated, NotRequired, TypedDict -class AuthorTypedDict(TypedDict): +class GetAtsNotesPositiveResponseAuthorTypedDict(TypedDict): id: str r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" remote_id: Nullable[str] @@ -24,7 +24,7 @@ class AuthorTypedDict(TypedDict): r"""Email of the user. If the email address is invalid, it will be set to null.""" -class Author(BaseModel): +class GetAtsNotesPositiveResponseAuthor(BaseModel): id: str r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" @@ -99,7 +99,7 @@ class GetAtsNotesPositiveResponseResultTypedDict(TypedDict): r"""The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString """ - author: Nullable[AuthorTypedDict] + author: Nullable[GetAtsNotesPositiveResponseAuthorTypedDict] class GetAtsNotesPositiveResponseResult(BaseModel): @@ -147,7 +147,7 @@ class GetAtsNotesPositiveResponseResult(BaseModel): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString """ - author: Nullable[Author] + author: Nullable[GetAtsNotesPositiveResponseAuthor] @model_serializer(mode="wrap") def serialize_model(self, handler): diff --git a/src/kombo/models/getatsscorecardsop.py b/src/kombo/models/getatsscorecardsop.py new file mode 100644 index 0000000..64f4f01 --- /dev/null +++ b/src/kombo/models/getatsscorecardsop.py @@ -0,0 +1,194 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .getatsscorecardspositiveresponse import ( + GetAtsScorecardsPositiveResponse, + GetAtsScorecardsPositiveResponseTypedDict, +) +from datetime import datetime +from kombo.types import BaseModel, UNSET_SENTINEL +from kombo.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata +import pydantic +from pydantic import model_serializer +from typing import Awaitable, Callable, List, Optional, Union +from typing_extensions import Annotated, NotRequired, TypedDict + + +class GetAtsScorecardsGlobalsTypedDict(TypedDict): + integration_id: NotRequired[str] + r"""ID of the integration you want to interact with.""" + + +class GetAtsScorecardsGlobals(BaseModel): + integration_id: Annotated[ + Optional[str], + pydantic.Field(alias="X-Integration-Id"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""ID of the integration you want to interact with.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["integration_id"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + + +class GetAtsScorecardsRequestTypedDict(TypedDict): + cursor: NotRequired[str] + r"""An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response.""" + page_size: NotRequired[int] + r"""The number of results to return per page. Maximum is 250.""" + updated_after: NotRequired[datetime] + r"""Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged. + + If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden. + + For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior). + + For this endpoint, `updated_after` matches when the returned record changed, or when related data changed as described below. + + | Path | Added/Removed | Linked Record | + | --- | --- | --- | + | `author` | ✗ No | ✗ No | + | `application` | ✗ No | ✗ No | + | `candidate` | ✗ No | ✗ No | + | `interview` | ✗ No | ✗ No | + + _**Added/Removed**: Whether adding or removing entries from this list triggers an update (n/a for single records). **Linked Record**: Whether changes to the linked record itself trigger an update._ + """ + include_deleted: NotRequired[bool] + r"""By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too.""" + ignore_unsupported_filters: NotRequired[bool] + r"""When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results.""" + ids: NotRequired[List[str]] + r"""Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`.""" + remote_ids: NotRequired[List[str]] + r"""Filter by a comma-separated list of remote IDs.""" + candidate_ids: NotRequired[List[str]] + r"""Filter by a comma-separated list of candidate IDs. Prefer filtering by `candidate_ids` when you want to download the full interview feedback available for a candidate, across all their applications.""" + application_ids: NotRequired[List[str]] + r"""Filter by a comma-separated list of application IDs. We will only return scorecards that belong to _any_ of these applications.""" + + +class GetAtsScorecardsRequest(BaseModel): + cursor: Annotated[ + Optional[str], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = None + r"""An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response.""" + + page_size: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 100 + r"""The number of results to return per page. Maximum is 250.""" + + updated_after: Annotated[ + Optional[datetime], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = None + r"""Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged. + + If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden. + + For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior). + + For this endpoint, `updated_after` matches when the returned record changed, or when related data changed as described below. + + | Path | Added/Removed | Linked Record | + | --- | --- | --- | + | `author` | ✗ No | ✗ No | + | `application` | ✗ No | ✗ No | + | `candidate` | ✗ No | ✗ No | + | `interview` | ✗ No | ✗ No | + + _**Added/Removed**: Whether adding or removing entries from this list triggers an update (n/a for single records). **Linked Record**: Whether changes to the linked record itself trigger an update._ + """ + + include_deleted: Annotated[ + Optional[bool], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = False + r"""By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too.""" + + ignore_unsupported_filters: Annotated[ + Optional[bool], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = False + r"""When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results.""" + + ids: Annotated[ + Optional[List[str]], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`.""" + + remote_ids: Annotated[ + Optional[List[str]], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""Filter by a comma-separated list of remote IDs.""" + + candidate_ids: Annotated[ + Optional[List[str]], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""Filter by a comma-separated list of candidate IDs. Prefer filtering by `candidate_ids` when you want to download the full interview feedback available for a candidate, across all their applications.""" + + application_ids: Annotated[ + Optional[List[str]], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""Filter by a comma-separated list of application IDs. We will only return scorecards that belong to _any_ of these applications.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "cursor", + "page_size", + "updated_after", + "include_deleted", + "ignore_unsupported_filters", + "ids", + "remote_ids", + "candidate_ids", + "application_ids", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + + +class GetAtsScorecardsResponseTypedDict(TypedDict): + result: GetAtsScorecardsPositiveResponseTypedDict + + +class GetAtsScorecardsResponse(BaseModel): + next: Union[ + Callable[[], Optional[GetAtsScorecardsResponse]], + Callable[[], Awaitable[Optional[GetAtsScorecardsResponse]]], + ] + + result: GetAtsScorecardsPositiveResponse diff --git a/src/kombo/models/getatsscorecardspositiveresponse.py b/src/kombo/models/getatsscorecardspositiveresponse.py new file mode 100644 index 0000000..199489c --- /dev/null +++ b/src/kombo/models/getatsscorecardspositiveresponse.py @@ -0,0 +1,713 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from datetime import datetime +from kombo.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL +from kombo.utils import validate_const +import pydantic +from pydantic import Field, model_serializer +from pydantic.functional_validators import AfterValidator +from typing import List, Literal, Union +from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict + + +class ResultDateTypedDict(TypedDict): + remote_id: Nullable[str] + r"""ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric.""" + label: str + r"""The question or attribute being assessed, e.g. \"Willingness to travel\".""" + description: Nullable[str] + r"""Guidance the ATS shows the interviewer below the question, e.g. \"1 is poor, 4 is great\".""" + required: Nullable[bool] + r"""Whether the ATS marked this question mandatory.""" + answer: Nullable[str] + r"""Date in `YYYY-MM-DD` format.""" + type: Literal["DATE"] + + +class ResultDate(BaseModel): + remote_id: Nullable[str] + r"""ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric.""" + + label: str + r"""The question or attribute being assessed, e.g. \"Willingness to travel\".""" + + description: Nullable[str] + r"""Guidance the ATS shows the interviewer below the question, e.g. \"1 is poor, 4 is great\".""" + + required: Nullable[bool] + r"""Whether the ATS marked this question mandatory.""" + + answer: Nullable[str] + r"""Date in `YYYY-MM-DD` format.""" + + TYPE: Annotated[ + Annotated[Literal["DATE"], AfterValidator(validate_const("DATE"))], + pydantic.Field(alias="type"), + ] = "DATE" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class ResultNumberTypedDict(TypedDict): + remote_id: Nullable[str] + r"""ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric.""" + label: str + r"""The question or attribute being assessed, e.g. \"Willingness to travel\".""" + description: Nullable[str] + r"""Guidance the ATS shows the interviewer below the question, e.g. \"1 is poor, 4 is great\".""" + required: Nullable[bool] + r"""Whether the ATS marked this question mandatory.""" + answer: Nullable[float] + r"""A decimal value.""" + type: Literal["NUMBER"] + + +class ResultNumber(BaseModel): + remote_id: Nullable[str] + r"""ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric.""" + + label: str + r"""The question or attribute being assessed, e.g. \"Willingness to travel\".""" + + description: Nullable[str] + r"""Guidance the ATS shows the interviewer below the question, e.g. \"1 is poor, 4 is great\".""" + + required: Nullable[bool] + r"""Whether the ATS marked this question mandatory.""" + + answer: Nullable[float] + r"""A decimal value.""" + + TYPE: Annotated[ + Annotated[Literal["NUMBER"], AfterValidator(validate_const("NUMBER"))], + pydantic.Field(alias="type"), + ] = "NUMBER" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class ResultBooleanTypedDict(TypedDict): + remote_id: Nullable[str] + r"""ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric.""" + label: str + r"""The question or attribute being assessed, e.g. \"Willingness to travel\".""" + description: Nullable[str] + r"""Guidance the ATS shows the interviewer below the question, e.g. \"1 is poor, 4 is great\".""" + required: Nullable[bool] + r"""Whether the ATS marked this question mandatory.""" + answer: Nullable[bool] + r"""The yes/no the interviewer picked.""" + type: Literal["BOOLEAN"] + + +class ResultBoolean(BaseModel): + remote_id: Nullable[str] + r"""ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric.""" + + label: str + r"""The question or attribute being assessed, e.g. \"Willingness to travel\".""" + + description: Nullable[str] + r"""Guidance the ATS shows the interviewer below the question, e.g. \"1 is poor, 4 is great\".""" + + required: Nullable[bool] + r"""Whether the ATS marked this question mandatory.""" + + answer: Nullable[bool] + r"""The yes/no the interviewer picked.""" + + TYPE: Annotated[ + Annotated[Literal["BOOLEAN"], AfterValidator(validate_const("BOOLEAN"))], + pydantic.Field(alias="type"), + ] = "BOOLEAN" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class GetAtsScorecardsPositiveResponseOption2TypedDict(TypedDict): + remote_id: Nullable[str] + r"""The ID of this option in the remote system, e.g. `strong_hire`. `null` when the system identifies the option only by its label.""" + label: str + r"""The option as the interviewer sees it, e.g. \"Strong Hire\".""" + + +class GetAtsScorecardsPositiveResponseOption2(BaseModel): + remote_id: Nullable[str] + r"""The ID of this option in the remote system, e.g. `strong_hire`. `null` when the system identifies the option only by its label.""" + + label: str + r"""The option as the interviewer sees it, e.g. \"Strong Hire\".""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class GetAtsScorecardsPositiveResponseAnswer2TypedDict(TypedDict): + remote_id: Nullable[str] + r"""The ID of this option in the remote system, e.g. `strong_hire`. `null` when the system identifies the option only by its label.""" + label: str + r"""The option as the interviewer sees it, e.g. \"Strong Hire\".""" + + +class GetAtsScorecardsPositiveResponseAnswer2(BaseModel): + remote_id: Nullable[str] + r"""The ID of this option in the remote system, e.g. `strong_hire`. `null` when the system identifies the option only by its label.""" + + label: str + r"""The option as the interviewer sees it, e.g. \"Strong Hire\".""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class ResultMultiSelectTypedDict(TypedDict): + remote_id: Nullable[str] + r"""ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric.""" + label: str + r"""The question or attribute being assessed, e.g. \"Willingness to travel\".""" + description: Nullable[str] + r"""Guidance the ATS shows the interviewer below the question, e.g. \"1 is poor, 4 is great\".""" + required: Nullable[bool] + r"""Whether the ATS marked this question mandatory.""" + options: List[GetAtsScorecardsPositiveResponseOption2TypedDict] + r"""Every option available for select and multi-select questions.""" + answer: Nullable[List[GetAtsScorecardsPositiveResponseAnswer2TypedDict]] + r"""An array of ids and labels with every selected option.""" + type: Literal["MULTI_SELECT"] + + +class ResultMultiSelect(BaseModel): + remote_id: Nullable[str] + r"""ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric.""" + + label: str + r"""The question or attribute being assessed, e.g. \"Willingness to travel\".""" + + description: Nullable[str] + r"""Guidance the ATS shows the interviewer below the question, e.g. \"1 is poor, 4 is great\".""" + + required: Nullable[bool] + r"""Whether the ATS marked this question mandatory.""" + + options: List[GetAtsScorecardsPositiveResponseOption2] + r"""Every option available for select and multi-select questions.""" + + answer: Nullable[List[GetAtsScorecardsPositiveResponseAnswer2]] + r"""An array of ids and labels with every selected option.""" + + TYPE: Annotated[ + Annotated[ + Literal["MULTI_SELECT"], AfterValidator(validate_const("MULTI_SELECT")) + ], + pydantic.Field(alias="type"), + ] = "MULTI_SELECT" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class GetAtsScorecardsPositiveResponseOption1TypedDict(TypedDict): + remote_id: Nullable[str] + r"""The ID of this option in the remote system, e.g. `strong_hire`. `null` when the system identifies the option only by its label.""" + label: str + r"""The option as the interviewer sees it, e.g. \"Strong Hire\".""" + + +class GetAtsScorecardsPositiveResponseOption1(BaseModel): + remote_id: Nullable[str] + r"""The ID of this option in the remote system, e.g. `strong_hire`. `null` when the system identifies the option only by its label.""" + + label: str + r"""The option as the interviewer sees it, e.g. \"Strong Hire\".""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class GetAtsScorecardsPositiveResponseAnswer1TypedDict(TypedDict): + r"""The id and label of the selected option.""" + + remote_id: Nullable[str] + r"""The ID of this option in the remote system, e.g. `strong_hire`. `null` when the system identifies the option only by its label.""" + label: str + r"""The option as the interviewer sees it, e.g. \"Strong Hire\".""" + + +class GetAtsScorecardsPositiveResponseAnswer1(BaseModel): + r"""The id and label of the selected option.""" + + remote_id: Nullable[str] + r"""The ID of this option in the remote system, e.g. `strong_hire`. `null` when the system identifies the option only by its label.""" + + label: str + r"""The option as the interviewer sees it, e.g. \"Strong Hire\".""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class ResultSingleSelectTypedDict(TypedDict): + remote_id: Nullable[str] + r"""ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric.""" + label: str + r"""The question or attribute being assessed, e.g. \"Willingness to travel\".""" + description: Nullable[str] + r"""Guidance the ATS shows the interviewer below the question, e.g. \"1 is poor, 4 is great\".""" + required: Nullable[bool] + r"""Whether the ATS marked this question mandatory.""" + options: List[GetAtsScorecardsPositiveResponseOption1TypedDict] + r"""Every option available for select and multi-select questions.""" + answer: Nullable[GetAtsScorecardsPositiveResponseAnswer1TypedDict] + r"""The id and label of the selected option.""" + type: Literal["SINGLE_SELECT"] + + +class ResultSingleSelect(BaseModel): + remote_id: Nullable[str] + r"""ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric.""" + + label: str + r"""The question or attribute being assessed, e.g. \"Willingness to travel\".""" + + description: Nullable[str] + r"""Guidance the ATS shows the interviewer below the question, e.g. \"1 is poor, 4 is great\".""" + + required: Nullable[bool] + r"""Whether the ATS marked this question mandatory.""" + + options: List[GetAtsScorecardsPositiveResponseOption1] + r"""Every option available for select and multi-select questions.""" + + answer: Nullable[GetAtsScorecardsPositiveResponseAnswer1] + r"""The id and label of the selected option.""" + + TYPE: Annotated[ + Annotated[ + Literal["SINGLE_SELECT"], AfterValidator(validate_const("SINGLE_SELECT")) + ], + pydantic.Field(alias="type"), + ] = "SINGLE_SELECT" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class ResultTextTypedDict(TypedDict): + remote_id: Nullable[str] + r"""ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric.""" + label: str + r"""The question or attribute being assessed, e.g. \"Willingness to travel\".""" + description: Nullable[str] + r"""Guidance the ATS shows the interviewer below the question, e.g. \"1 is poor, 4 is great\".""" + required: Nullable[bool] + r"""Whether the ATS marked this question mandatory.""" + answer: Nullable[str] + r"""The text the interviewer wrote.""" + type: Literal["TEXT"] + + +class ResultText(BaseModel): + remote_id: Nullable[str] + r"""ID of the question in the connected ATS. `null` when the ATS keeps the headline rating or summary outside the rubric.""" + + label: str + r"""The question or attribute being assessed, e.g. \"Willingness to travel\".""" + + description: Nullable[str] + r"""Guidance the ATS shows the interviewer below the question, e.g. \"1 is poor, 4 is great\".""" + + required: Nullable[bool] + r"""Whether the ATS marked this question mandatory.""" + + answer: Nullable[str] + r"""The text the interviewer wrote.""" + + TYPE: Annotated[ + Annotated[Literal["TEXT"], AfterValidator(validate_const("TEXT"))], + pydantic.Field(alias="type"), + ] = "TEXT" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +ResponseTypedDict = TypeAliasType( + "ResponseTypedDict", + Union[ + ResultTextTypedDict, + ResultBooleanTypedDict, + ResultNumberTypedDict, + ResultDateTypedDict, + ResultSingleSelectTypedDict, + ResultMultiSelectTypedDict, + ], +) + + +Response = Annotated[ + Union[ + ResultText, + ResultSingleSelect, + ResultMultiSelect, + ResultBoolean, + ResultNumber, + ResultDate, + ], + Field(discriminator="TYPE"), +] + + +class GetAtsScorecardsPositiveResponseAuthorTypedDict(TypedDict): + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" + remote_id: Nullable[str] + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.""" + first_name: Nullable[str] + r"""First name of the user.""" + last_name: Nullable[str] + r"""Last name of the user.""" + email: NotRequired[Nullable[str]] + r"""Email of the user. If the email address is invalid, it will be set to null.""" + + +class GetAtsScorecardsPositiveResponseAuthor(BaseModel): + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" + + remote_id: Nullable[str] + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.""" + + first_name: Nullable[str] + r"""First name of the user.""" + + last_name: Nullable[str] + r"""Last name of the user.""" + + email: OptionalNullable[str] = UNSET + r"""Email of the user. If the email address is invalid, it will be set to null.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["email"]) + nullable_fields = set(["remote_id", "first_name", "last_name", "email"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m + + +class GetAtsScorecardsPositiveResponseResultTypedDict(TypedDict): + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" + remote_id: str + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.""" + candidate_id: Nullable[str] + r"""The Kombo ID of the candidate this scorecard evaluates.""" + application_id: Nullable[str] + r"""The Kombo ID of the application this scorecard belongs to.""" + interview_id: Nullable[str] + r"""The Kombo ID of the interview this scorecard was submitted against.""" + author_id: Nullable[str] + r"""The Kombo ID of the user this evaluation belongs to. Where the ATS distinguishes who submitted the scorecard from whose review it is, this is the source of the opinion (the user whose evaluation it is, not whoever entered it). The ID can be used to retrieve the user from the `get users` endpoint.""" + remote_created_at: Nullable[datetime] + r"""The date and time the object was created in the remote system. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + remote_updated_at: Nullable[datetime] + r"""A timestamp retrieved from the remote system, describing when the resource was last updated. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + changed_at: datetime + r"""The timestamp when this specific record was last modified. This field only updates when properties directly on this record change, NOT when related or nested models change. For filtering that considers nested data changes, use the `updated_after` parameter which will return records when either the record itself OR its related models have been updated. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + remote_deleted_at: Nullable[datetime] + r"""The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + author: Nullable[GetAtsScorecardsPositiveResponseAuthorTypedDict] + responses: NotRequired[Nullable[List[ResponseTypedDict]]] + r"""Every question on the scorecard, together with its definition and the answer submitted by the interviewer.""" + + +class GetAtsScorecardsPositiveResponseResult(BaseModel): + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" + + remote_id: str + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.""" + + candidate_id: Nullable[str] + r"""The Kombo ID of the candidate this scorecard evaluates.""" + + application_id: Nullable[str] + r"""The Kombo ID of the application this scorecard belongs to.""" + + interview_id: Nullable[str] + r"""The Kombo ID of the interview this scorecard was submitted against.""" + + author_id: Nullable[str] + r"""The Kombo ID of the user this evaluation belongs to. Where the ATS distinguishes who submitted the scorecard from whose review it is, this is the source of the opinion (the user whose evaluation it is, not whoever entered it). The ID can be used to retrieve the user from the `get users` endpoint.""" + + remote_created_at: Nullable[datetime] + r"""The date and time the object was created in the remote system. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + + remote_updated_at: Nullable[datetime] + r"""A timestamp retrieved from the remote system, describing when the resource was last updated. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + + changed_at: datetime + r"""The timestamp when this specific record was last modified. This field only updates when properties directly on this record change, NOT when related or nested models change. For filtering that considers nested data changes, use the `updated_after` parameter which will return records when either the record itself OR its related models have been updated. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + + remote_deleted_at: Nullable[datetime] + r"""The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + + author: Nullable[GetAtsScorecardsPositiveResponseAuthor] + + responses: OptionalNullable[List[Response]] = UNSET + r"""Every question on the scorecard, together with its definition and the answer submitted by the interviewer.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["responses"]) + nullable_fields = set( + [ + "candidate_id", + "application_id", + "interview_id", + "author_id", + "responses", + "remote_created_at", + "remote_updated_at", + "remote_deleted_at", + "author", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m + + +class GetAtsScorecardsPositiveResponseDataTypedDict(TypedDict): + next: Nullable[str] + r"""Cursor string that can be passed to the `cursor` query parameter to get the next page. If this is `null`, then there are no more pages.""" + results: List[GetAtsScorecardsPositiveResponseResultTypedDict] + + +class GetAtsScorecardsPositiveResponseData(BaseModel): + next: Nullable[str] + r"""Cursor string that can be passed to the `cursor` query parameter to get the next page. If this is `null`, then there are no more pages.""" + + results: List[GetAtsScorecardsPositiveResponseResult] + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class GetAtsScorecardsPositiveResponseTypedDict(TypedDict): + data: GetAtsScorecardsPositiveResponseDataTypedDict + status: Literal["success"] + + +class GetAtsScorecardsPositiveResponse(BaseModel): + data: GetAtsScorecardsPositiveResponseData + + STATUS: Annotated[ + Annotated[Literal["success"], AfterValidator(validate_const("success"))], + pydantic.Field(alias="status"), + ] = "success" + + +try: + ResultDate.model_rebuild() +except NameError: + pass +try: + ResultNumber.model_rebuild() +except NameError: + pass +try: + ResultBoolean.model_rebuild() +except NameError: + pass +try: + ResultMultiSelect.model_rebuild() +except NameError: + pass +try: + ResultSingleSelect.model_rebuild() +except NameError: + pass +try: + ResultText.model_rebuild() +except NameError: + pass +try: + GetAtsScorecardsPositiveResponse.model_rebuild() +except NameError: + pass diff --git a/src/kombo/models/gethrispayrunsop.py b/src/kombo/models/gethrispayrunsop.py new file mode 100644 index 0000000..3a9cd72 --- /dev/null +++ b/src/kombo/models/gethrispayrunsop.py @@ -0,0 +1,167 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .gethrispayrunspositiveresponse import ( + GetHrisPayRunsPositiveResponse, + GetHrisPayRunsPositiveResponseTypedDict, +) +from datetime import datetime +from kombo.types import BaseModel, UNSET_SENTINEL +from kombo.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata +import pydantic +from pydantic import model_serializer +from typing import Awaitable, Callable, List, Optional, Union +from typing_extensions import Annotated, NotRequired, TypedDict + + +class GetHrisPayRunsGlobalsTypedDict(TypedDict): + integration_id: NotRequired[str] + r"""ID of the integration you want to interact with.""" + + +class GetHrisPayRunsGlobals(BaseModel): + integration_id: Annotated[ + Optional[str], + pydantic.Field(alias="X-Integration-Id"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""ID of the integration you want to interact with.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["integration_id"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + + +class GetHrisPayRunsRequestTypedDict(TypedDict): + cursor: NotRequired[str] + r"""An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response.""" + page_size: NotRequired[int] + r"""The number of results to return per page. Maximum is 250.""" + updated_after: NotRequired[datetime] + r"""Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged. + + If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden. + + For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior). + + For this endpoint, only changes to the returned record itself are considered. + """ + include_deleted: NotRequired[bool] + r"""By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too.""" + ignore_unsupported_filters: NotRequired[bool] + r"""When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results.""" + ids: NotRequired[List[str]] + r"""Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`.""" + remote_ids: NotRequired[List[str]] + r"""Filter by a comma-separated list of remote IDs.""" + legal_entity_ids: NotRequired[List[str]] + r"""Filter by a comma-separated list of legal entity IDs.""" + + +class GetHrisPayRunsRequest(BaseModel): + cursor: Annotated[ + Optional[str], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = None + r"""An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response.""" + + page_size: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 100 + r"""The number of results to return per page. Maximum is 250.""" + + updated_after: Annotated[ + Optional[datetime], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = None + r"""Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged. + + If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden. + + For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior). + + For this endpoint, only changes to the returned record itself are considered. + """ + + include_deleted: Annotated[ + Optional[bool], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = False + r"""By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too.""" + + ignore_unsupported_filters: Annotated[ + Optional[bool], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = False + r"""When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results.""" + + ids: Annotated[ + Optional[List[str]], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`.""" + + remote_ids: Annotated[ + Optional[List[str]], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""Filter by a comma-separated list of remote IDs.""" + + legal_entity_ids: Annotated[ + Optional[List[str]], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""Filter by a comma-separated list of legal entity IDs.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "cursor", + "page_size", + "updated_after", + "include_deleted", + "ignore_unsupported_filters", + "ids", + "remote_ids", + "legal_entity_ids", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + + +class GetHrisPayRunsResponseTypedDict(TypedDict): + result: GetHrisPayRunsPositiveResponseTypedDict + + +class GetHrisPayRunsResponse(BaseModel): + next: Union[ + Callable[[], Optional[GetHrisPayRunsResponse]], + Callable[[], Awaitable[Optional[GetHrisPayRunsResponse]]], + ] + + result: GetHrisPayRunsPositiveResponse diff --git a/src/kombo/models/gethrispayrunspositiveresponse.py b/src/kombo/models/gethrispayrunspositiveresponse.py new file mode 100644 index 0000000..c26d99d --- /dev/null +++ b/src/kombo/models/gethrispayrunspositiveresponse.py @@ -0,0 +1,227 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from datetime import date, datetime +from kombo.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL +from kombo.utils import validate_const +import pydantic +from pydantic import model_serializer +from pydantic.functional_validators import AfterValidator +from typing import List, Literal +from typing_extensions import Annotated, NotRequired, TypedDict + + +class GetHrisPayRunsPositiveResponseGrossPayTypedDict(TypedDict): + r"""The total gross pay for the pay run, before taxes and after gross deductions.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + value: float + r"""The monetary value.""" + + +class GetHrisPayRunsPositiveResponseGrossPay(BaseModel): + r"""The total gross pay for the pay run, before taxes and after gross deductions.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + + value: float + r"""The monetary value.""" + + +class GetHrisPayRunsPositiveResponseNetPayTypedDict(TypedDict): + r"""The total net pay for the pay run, after taxes have been applied to the gross pay.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + value: float + r"""The monetary value.""" + + +class GetHrisPayRunsPositiveResponseNetPay(BaseModel): + r"""The total net pay for the pay run, after taxes have been applied to the gross pay.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + + value: float + r"""The monetary value.""" + + +class GetHrisPayRunsPositiveResponsePaidAmountTypedDict(TypedDict): + r"""The total amount paid out through the pay run. This value accounts for net earnings and deductions.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + value: float + r"""The monetary value.""" + + +class GetHrisPayRunsPositiveResponsePaidAmount(BaseModel): + r"""The total amount paid out through the pay run. This value accounts for net earnings and deductions.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + + value: float + r"""The monetary value.""" + + +class GetHrisPayRunsPositiveResponseTotalsTypedDict(TypedDict): + gross_pay: NotRequired[Nullable[GetHrisPayRunsPositiveResponseGrossPayTypedDict]] + r"""The total gross pay for the pay run, before taxes and after gross deductions.""" + net_pay: NotRequired[Nullable[GetHrisPayRunsPositiveResponseNetPayTypedDict]] + r"""The total net pay for the pay run, after taxes have been applied to the gross pay.""" + paid_amount: NotRequired[ + Nullable[GetHrisPayRunsPositiveResponsePaidAmountTypedDict] + ] + r"""The total amount paid out through the pay run. This value accounts for net earnings and deductions.""" + + +class GetHrisPayRunsPositiveResponseTotals(BaseModel): + gross_pay: OptionalNullable[GetHrisPayRunsPositiveResponseGrossPay] = UNSET + r"""The total gross pay for the pay run, before taxes and after gross deductions.""" + + net_pay: OptionalNullable[GetHrisPayRunsPositiveResponseNetPay] = UNSET + r"""The total net pay for the pay run, after taxes have been applied to the gross pay.""" + + paid_amount: OptionalNullable[GetHrisPayRunsPositiveResponsePaidAmount] = UNSET + r"""The total amount paid out through the pay run. This value accounts for net earnings and deductions.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["gross_pay", "net_pay", "paid_amount"]) + nullable_fields = set(["gross_pay", "net_pay", "paid_amount"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m + + +class GetHrisPayRunsPositiveResponseResultTypedDict(TypedDict): + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" + remote_id: str + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.""" + start_date: Nullable[date] + r"""The start date of the pay run, as a calendar date (`yyyy-MM-dd`).""" + end_date: Nullable[date] + r"""The end date of the pay run, as a calendar date (`yyyy-MM-dd`).""" + legal_entity_id: Nullable[str] + r"""The Kombo ID of the pay run’s legal entity. The ID can be used to retrieve the legal entity from the `get legal entities` endpoint.""" + changed_at: datetime + r"""The timestamp when this specific record was last modified. This field only updates when properties directly on this record change, NOT when related or nested models change. For filtering that considers nested data changes, use the `updated_after` parameter which will return records when either the record itself OR its related models have been updated. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + remote_deleted_at: Nullable[datetime] + r"""The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + totals: GetHrisPayRunsPositiveResponseTotalsTypedDict + + +class GetHrisPayRunsPositiveResponseResult(BaseModel): + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" + + remote_id: str + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.""" + + start_date: Nullable[date] + r"""The start date of the pay run, as a calendar date (`yyyy-MM-dd`).""" + + end_date: Nullable[date] + r"""The end date of the pay run, as a calendar date (`yyyy-MM-dd`).""" + + legal_entity_id: Nullable[str] + r"""The Kombo ID of the pay run’s legal entity. The ID can be used to retrieve the legal entity from the `get legal entities` endpoint.""" + + changed_at: datetime + r"""The timestamp when this specific record was last modified. This field only updates when properties directly on this record change, NOT when related or nested models change. For filtering that considers nested data changes, use the `updated_after` parameter which will return records when either the record itself OR its related models have been updated. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + + remote_deleted_at: Nullable[datetime] + r"""The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + + totals: GetHrisPayRunsPositiveResponseTotals + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class GetHrisPayRunsPositiveResponseDataTypedDict(TypedDict): + next: Nullable[str] + r"""Cursor string that can be passed to the `cursor` query parameter to get the next page. If this is `null`, then there are no more pages.""" + results: List[GetHrisPayRunsPositiveResponseResultTypedDict] + + +class GetHrisPayRunsPositiveResponseData(BaseModel): + next: Nullable[str] + r"""Cursor string that can be passed to the `cursor` query parameter to get the next page. If this is `null`, then there are no more pages.""" + + results: List[GetHrisPayRunsPositiveResponseResult] + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class GetHrisPayRunsPositiveResponseTypedDict(TypedDict): + data: GetHrisPayRunsPositiveResponseDataTypedDict + status: Literal["success"] + + +class GetHrisPayRunsPositiveResponse(BaseModel): + data: GetHrisPayRunsPositiveResponseData + + STATUS: Annotated[ + Annotated[Literal["success"], AfterValidator(validate_const("success"))], + pydantic.Field(alias="status"), + ] = "success" + + +try: + GetHrisPayRunsPositiveResponse.model_rebuild() +except NameError: + pass diff --git a/src/kombo/models/gethrispayslipsop.py b/src/kombo/models/gethrispayslipsop.py new file mode 100644 index 0000000..aeea3ad --- /dev/null +++ b/src/kombo/models/gethrispayslipsop.py @@ -0,0 +1,203 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .gethrispayslipspositiveresponse import ( + GetHrisPayslipsPositiveResponse, + GetHrisPayslipsPositiveResponseTypedDict, +) +from datetime import datetime +from kombo.types import BaseModel, UNSET_SENTINEL +from kombo.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata +import pydantic +from pydantic import model_serializer +from typing import Awaitable, Callable, List, Optional, Union +from typing_extensions import Annotated, NotRequired, TypedDict + + +class GetHrisPayslipsGlobalsTypedDict(TypedDict): + integration_id: NotRequired[str] + r"""ID of the integration you want to interact with.""" + + +class GetHrisPayslipsGlobals(BaseModel): + integration_id: Annotated[ + Optional[str], + pydantic.Field(alias="X-Integration-Id"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] = None + r"""ID of the integration you want to interact with.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["integration_id"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + + +class GetHrisPayslipsRequestTypedDict(TypedDict): + cursor: NotRequired[str] + r"""An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response.""" + page_size: NotRequired[int] + r"""The number of results to return per page. Maximum is 250.""" + updated_after: NotRequired[datetime] + r"""Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged. + + If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden. + + For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior). + + For this endpoint, `updated_after` matches when the returned record changed, or when related data changed as described below. + + | Path | Added/Removed | Linked Record | + | --- | --- | --- | + | `employee` | ✗ No | ✗ No | + | `pay_run` | ✗ No | ✗ No | + | `line_items` | ✓ Yes | ✓ Yes | + | `line_items` → `salary_type` | ✗ No | ✗ No | + + _**Added/Removed**: Whether adding or removing entries from this list triggers an update (n/a for single records). **Linked Record**: Whether changes to the linked record itself trigger an update._ + """ + include_deleted: NotRequired[bool] + r"""By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too.""" + ignore_unsupported_filters: NotRequired[bool] + r"""When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results.""" + ids: NotRequired[List[str]] + r"""Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`.""" + remote_ids: NotRequired[List[str]] + r"""Filter by a comma-separated list of remote IDs.""" + legal_entity_ids: NotRequired[List[str]] + r"""Filter by a comma-separated list of legal entity IDs.""" + employee_ids: NotRequired[List[str]] + r"""Filter by a comma-separated list of employee IDs.""" + payrun_ids: NotRequired[List[str]] + r"""Filter by a comma-separated list of payrun IDs.""" + + +class GetHrisPayslipsRequest(BaseModel): + cursor: Annotated[ + Optional[str], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = None + r"""An optional cursor string used for pagination. This can be retrieved from the `next` property of the previous page response.""" + + page_size: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 100 + r"""The number of results to return per page. Maximum is 250.""" + + updated_after: Annotated[ + Optional[datetime], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = None + r"""Filter the entries based on the modification date in format `YYYY-MM-DDTHH:mm:ss.sssZ`. Returns records where either the record itself **OR** its nested data has been updated since this timestamp, even if the record's own `changed_at` field remains unchanged. + + If you want to track entry deletion, also set the `include_deleted=true` query parameter, because otherwise, deleted entries will be hidden. + + For more details, see [Understanding changed_at vs updated_after Behavior](https://docs.kombo.dev/ats/getting-started/fetching-data#understanding-changed_at-vs-updated_after-behavior). + + For this endpoint, `updated_after` matches when the returned record changed, or when related data changed as described below. + + | Path | Added/Removed | Linked Record | + | --- | --- | --- | + | `employee` | ✗ No | ✗ No | + | `pay_run` | ✗ No | ✗ No | + | `line_items` | ✓ Yes | ✓ Yes | + | `line_items` → `salary_type` | ✗ No | ✗ No | + + _**Added/Removed**: Whether adding or removing entries from this list triggers an update (n/a for single records). **Linked Record**: Whether changes to the linked record itself trigger an update._ + """ + + include_deleted: Annotated[ + Optional[bool], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = False + r"""By default, deleted entries are not returned. Use the `include_deleted` query param to include deleted entries too.""" + + ignore_unsupported_filters: Annotated[ + Optional[bool], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = False + r"""When set to `true`, filters targeting fields not supported by this integration will be ignored instead of filtering out all results.""" + + ids: Annotated[ + Optional[List[str]], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""Filter by a comma-separated list of IDs such as `222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3`.""" + + remote_ids: Annotated[ + Optional[List[str]], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""Filter by a comma-separated list of remote IDs.""" + + legal_entity_ids: Annotated[ + Optional[List[str]], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""Filter by a comma-separated list of legal entity IDs.""" + + employee_ids: Annotated[ + Optional[List[str]], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""Filter by a comma-separated list of employee IDs.""" + + payrun_ids: Annotated[ + Optional[List[str]], + FieldMetadata(query=QueryParamMetadata(style="form", explode=False)), + ] = None + r"""Filter by a comma-separated list of payrun IDs.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "cursor", + "page_size", + "updated_after", + "include_deleted", + "ignore_unsupported_filters", + "ids", + "remote_ids", + "legal_entity_ids", + "employee_ids", + "payrun_ids", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + + +class GetHrisPayslipsResponseTypedDict(TypedDict): + result: GetHrisPayslipsPositiveResponseTypedDict + + +class GetHrisPayslipsResponse(BaseModel): + next: Union[ + Callable[[], Optional[GetHrisPayslipsResponse]], + Callable[[], Awaitable[Optional[GetHrisPayslipsResponse]]], + ] + + result: GetHrisPayslipsPositiveResponse diff --git a/src/kombo/models/gethrispayslipspositiveresponse.py b/src/kombo/models/gethrispayslipspositiveresponse.py new file mode 100644 index 0000000..654a839 --- /dev/null +++ b/src/kombo/models/gethrispayslipspositiveresponse.py @@ -0,0 +1,425 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from datetime import date, datetime +from kombo.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL +from kombo.utils import validate_const +import pydantic +from pydantic import model_serializer +from pydantic.functional_validators import AfterValidator +from typing import List, Literal +from typing_extensions import Annotated, NotRequired, TypedDict + + +class GetHrisPayslipsPositiveResponseGrossPayTypedDict(TypedDict): + r"""The total gross pay for the payslip, before taxes and after gross deductions.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + value: float + r"""The monetary value.""" + + +class GetHrisPayslipsPositiveResponseGrossPay(BaseModel): + r"""The total gross pay for the payslip, before taxes and after gross deductions.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + + value: float + r"""The monetary value.""" + + +class GetHrisPayslipsPositiveResponseNetPayTypedDict(TypedDict): + r"""The total net pay for the payslip, after taxes have been applied to the gross pay.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + value: float + r"""The monetary value.""" + + +class GetHrisPayslipsPositiveResponseNetPay(BaseModel): + r"""The total net pay for the payslip, after taxes have been applied to the gross pay.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + + value: float + r"""The monetary value.""" + + +class GetHrisPayslipsPositiveResponsePaidAmountTypedDict(TypedDict): + r"""The amount of the payslip that was actually paid out to the employee. This value accounts for net earnings and deductions.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + value: float + r"""The monetary value.""" + + +class GetHrisPayslipsPositiveResponsePaidAmount(BaseModel): + r"""The amount of the payslip that was actually paid out to the employee. This value accounts for net earnings and deductions.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + + value: float + r"""The monetary value.""" + + +class GetHrisPayslipsPositiveResponseTotalsTypedDict(TypedDict): + gross_pay: NotRequired[Nullable[GetHrisPayslipsPositiveResponseGrossPayTypedDict]] + r"""The total gross pay for the payslip, before taxes and after gross deductions.""" + net_pay: NotRequired[Nullable[GetHrisPayslipsPositiveResponseNetPayTypedDict]] + r"""The total net pay for the payslip, after taxes have been applied to the gross pay.""" + paid_amount: NotRequired[ + Nullable[GetHrisPayslipsPositiveResponsePaidAmountTypedDict] + ] + r"""The amount of the payslip that was actually paid out to the employee. This value accounts for net earnings and deductions.""" + + +class GetHrisPayslipsPositiveResponseTotals(BaseModel): + gross_pay: OptionalNullable[GetHrisPayslipsPositiveResponseGrossPay] = UNSET + r"""The total gross pay for the payslip, before taxes and after gross deductions.""" + + net_pay: OptionalNullable[GetHrisPayslipsPositiveResponseNetPay] = UNSET + r"""The total net pay for the payslip, after taxes have been applied to the gross pay.""" + + paid_amount: OptionalNullable[GetHrisPayslipsPositiveResponsePaidAmount] = UNSET + r"""The amount of the payslip that was actually paid out to the employee. This value accounts for net earnings and deductions.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["gross_pay", "net_pay", "paid_amount"]) + nullable_fields = set(["gross_pay", "net_pay", "paid_amount"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m + + +class EmployeeTypedDict(TypedDict): + r"""The employee that the payslip is for.""" + + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" + remote_id: str + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.""" + first_name: Nullable[str] + r"""The employee’s first name.""" + last_name: Nullable[str] + r"""The employee’s last name.""" + display_full_name: Nullable[str] + r"""The employee’s full name, including any middle names. Not all HR systems provide an explicit display name, so we recommend falling back to `first_name` and `last_name`.""" + remote_deleted_at: Nullable[datetime] + r"""The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + work_email: NotRequired[Nullable[str]] + r"""The employee’s work email address. If the email address is invalid, we will set this to `null`.""" + + +class Employee(BaseModel): + r"""The employee that the payslip is for.""" + + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" + + remote_id: str + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.""" + + first_name: Nullable[str] + r"""The employee’s first name.""" + + last_name: Nullable[str] + r"""The employee’s last name.""" + + display_full_name: Nullable[str] + r"""The employee’s full name, including any middle names. Not all HR systems provide an explicit display name, so we recommend falling back to `first_name` and `last_name`.""" + + remote_deleted_at: Nullable[datetime] + r"""The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + + work_email: OptionalNullable[str] = UNSET + r"""The employee’s work email address. If the email address is invalid, we will set this to `null`.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["work_email"]) + nullable_fields = set( + [ + "first_name", + "last_name", + "display_full_name", + "work_email", + "remote_deleted_at", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m + + +class PayRunTypedDict(TypedDict): + r"""The pay run the payslip was paid out through.""" + + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" + remote_id: str + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.""" + start_date: Nullable[date] + r"""The start date of the pay run, as a calendar date (`yyyy-MM-dd`).""" + end_date: Nullable[date] + r"""The end date of the pay run, as a calendar date (`yyyy-MM-dd`).""" + legal_entity_id: Nullable[str] + r"""The Kombo ID of the pay run’s legal entity. The ID can be used to retrieve the legal entity from the `get legal entities` endpoint.""" + + +class PayRun(BaseModel): + r"""The pay run the payslip was paid out through.""" + + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" + + remote_id: str + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.""" + + start_date: Nullable[date] + r"""The start date of the pay run, as a calendar date (`yyyy-MM-dd`).""" + + end_date: Nullable[date] + r"""The end date of the pay run, as a calendar date (`yyyy-MM-dd`).""" + + legal_entity_id: Nullable[str] + r"""The Kombo ID of the pay run’s legal entity. The ID can be used to retrieve the legal entity from the `get legal entities` endpoint.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class AmountTypedDict(TypedDict): + r"""The amount of the line item.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + value: float + r"""The monetary value.""" + + +class Amount(BaseModel): + r"""The amount of the line item.""" + + currency: str + r"""The [ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) the value is denominated in.""" + + value: float + r"""The monetary value.""" + + +class LineItemTypedDict(TypedDict): + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing. For some integrations, this ID can still change if the payslip is edited.""" + remote_id: str + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key. This value may include the item's position on the payslip, which can change if the payslip is edited.""" + name: Nullable[str] + r"""The name of the salary type.""" + amount: NotRequired[Nullable[AmountTypedDict]] + r"""The amount of the line item.""" + + +class LineItem(BaseModel): + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing. For some integrations, this ID can still change if the payslip is edited.""" + + remote_id: str + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key. This value may include the item's position on the payslip, which can change if the payslip is edited.""" + + name: Nullable[str] + r"""The name of the salary type.""" + + amount: OptionalNullable[Amount] = UNSET + r"""The amount of the line item.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["amount"]) + nullable_fields = set(["name", "amount"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m + + +class GetHrisPayslipsPositiveResponseResultTypedDict(TypedDict): + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" + remote_id: str + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.""" + changed_at: datetime + r"""The timestamp when this specific record was last modified. This field only updates when properties directly on this record change, NOT when related or nested models change. For filtering that considers nested data changes, use the `updated_after` parameter which will return records when either the record itself OR its related models have been updated. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + remote_deleted_at: Nullable[datetime] + r"""The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + totals: GetHrisPayslipsPositiveResponseTotalsTypedDict + employee: EmployeeTypedDict + r"""The employee that the payslip is for.""" + pay_run: Nullable[PayRunTypedDict] + r"""The pay run the payslip was paid out through.""" + line_items: List[LineItemTypedDict] + r"""The individual earnings, deductions, and contributions that make up the payslip.""" + + +class GetHrisPayslipsPositiveResponseResult(BaseModel): + id: str + r"""The globally unique ID of this object generated by Kombo. We recommend using this as a stable primary key for syncing.""" + + remote_id: str + r"""The raw ID of the object in the remote system. We don't recommend using this as a primary key on your side as it might sometimes be compromised of multiple identifiers if a system doesn't provide a clear primary key.""" + + changed_at: datetime + r"""The timestamp when this specific record was last modified. This field only updates when properties directly on this record change, NOT when related or nested models change. For filtering that considers nested data changes, use the `updated_after` parameter which will return records when either the record itself OR its related models have been updated. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + + remote_deleted_at: Nullable[datetime] + r"""The date and time the object was deleted in the remote system. Objects are automatically marked as deleted when Kombo can't retrieve them from the remote system anymore. Kombo will also anonymize entries 14 days after they disappear. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + """ + + totals: GetHrisPayslipsPositiveResponseTotals + + employee: Employee + r"""The employee that the payslip is for.""" + + pay_run: Nullable[PayRun] + r"""The pay run the payslip was paid out through.""" + + line_items: List[LineItem] + r"""The individual earnings, deductions, and contributions that make up the payslip.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class GetHrisPayslipsPositiveResponseDataTypedDict(TypedDict): + next: Nullable[str] + r"""Cursor string that can be passed to the `cursor` query parameter to get the next page. If this is `null`, then there are no more pages.""" + results: List[GetHrisPayslipsPositiveResponseResultTypedDict] + + +class GetHrisPayslipsPositiveResponseData(BaseModel): + next: Nullable[str] + r"""Cursor string that can be passed to the `cursor` query parameter to get the next page. If this is `null`, then there are no more pages.""" + + results: List[GetHrisPayslipsPositiveResponseResult] + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class GetHrisPayslipsPositiveResponseTypedDict(TypedDict): + data: GetHrisPayslipsPositiveResponseDataTypedDict + status: Literal["success"] + + +class GetHrisPayslipsPositiveResponse(BaseModel): + data: GetHrisPayslipsPositiveResponseData + + STATUS: Annotated[ + Annotated[Literal["success"], AfterValidator(validate_const("success"))], + pydantic.Field(alias="status"), + ] = "success" + + +try: + GetHrisPayslipsPositiveResponse.model_rebuild() +except NameError: + pass diff --git a/src/kombo/models/issuestatuschangedwebhookpayload.py b/src/kombo/models/issuestatuschangedwebhookpayload.py new file mode 100644 index 0000000..4be9bca --- /dev/null +++ b/src/kombo/models/issuestatuschangedwebhookpayload.py @@ -0,0 +1,206 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from datetime import datetime +from kombo.types import BaseModel, Nullable, UNSET_SENTINEL +from pydantic import model_serializer +from typing import Literal +from typing_extensions import TypedDict + + +IssueStatusChangedWebhookPayloadType = Literal["issue-status-changed",] +r"""Type of the webhook event""" + + +Change = Literal[ + "raised", + "resolved", +] +r"""Why this webhook was sent: the issue was raised or resolved.""" + + +IssueStatusChangedWebhookPayloadStatus = Literal[ + "OPEN", + "RESOLVED", +] +r"""The issue status after this change.""" + + +class IssueTypedDict(TypedDict): + id: str + r"""The unique identifier of the issue.""" + type: str + r"""The issue type, for example `integration.authentication_failed`. Kombo will add more types over time. Treat unknown values as valid and handle them without failing.""" + title: str + r"""A short, customer-facing title for this issue type.""" + status: IssueStatusChangedWebhookPayloadStatus + r"""The issue status after this change.""" + markdown_message: str + r"""What is wrong and how to investigate or fix it.""" + first_observed_at: datetime + r"""ISO 8601 timestamp when Kombo first observed this episode of the issue.""" + resolved_at: Nullable[datetime] + r"""ISO 8601 timestamp when the issue was resolved. `null` while it is open.""" + + +class Issue(BaseModel): + id: str + r"""The unique identifier of the issue.""" + + type: str + r"""The issue type, for example `integration.authentication_failed`. Kombo will add more types over time. Treat unknown values as valid and handle them without failing.""" + + title: str + r"""A short, customer-facing title for this issue type.""" + + status: IssueStatusChangedWebhookPayloadStatus + r"""The issue status after this change.""" + + markdown_message: str + r"""What is wrong and how to investigate or fix it.""" + + first_observed_at: datetime + r"""ISO 8601 timestamp when Kombo first observed this episode of the issue.""" + + resolved_at: Nullable[datetime] + r"""ISO 8601 timestamp when the issue was resolved. `null` while it is open.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +IssueStatusChangedWebhookPayloadCategory = Literal[ + "HRIS", + "ATS", + "ASSESSMENT", + "LMS", +] +r"""The category of the integration (HRIS, ATS, ASSESSMENT, or LMS).""" + + +class IssueStatusChangedWebhookPayloadEndUserTypedDict(TypedDict): + r"""Information about the end user who created the integration.""" + + organization_name: str + r"""The name of the organization that owns the integration.""" + creator_email: Nullable[str] + r"""The email address of the user who created the integration.""" + origin_id: Nullable[str] + r"""The unique identifier of the organization in the integrated system.""" + + +class IssueStatusChangedWebhookPayloadEndUser(BaseModel): + r"""Information about the end user who created the integration.""" + + organization_name: str + r"""The name of the organization that owns the integration.""" + + creator_email: Nullable[str] + r"""The email address of the user who created the integration.""" + + origin_id: Nullable[str] + r"""The unique identifier of the organization in the integrated system.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class IntegrationTypedDict(TypedDict): + r"""The integration this issue belongs to. `null` for environment-wide issues.""" + + id: str + r"""The unique identifier of the integration.""" + tool: str + r"""The name of the integrated tool (e.g., \"personio\", \"greenhouse\").""" + category: IssueStatusChangedWebhookPayloadCategory + r"""The category of the integration (HRIS, ATS, ASSESSMENT, or LMS).""" + end_user: IssueStatusChangedWebhookPayloadEndUserTypedDict + r"""Information about the end user who created the integration.""" + + +class Integration(BaseModel): + r"""The integration this issue belongs to. `null` for environment-wide issues.""" + + id: str + r"""The unique identifier of the integration.""" + + tool: str + r"""The name of the integrated tool (e.g., \"personio\", \"greenhouse\").""" + + category: IssueStatusChangedWebhookPayloadCategory + r"""The category of the integration (HRIS, ATS, ASSESSMENT, or LMS).""" + + end_user: IssueStatusChangedWebhookPayloadEndUser + r"""Information about the end user who created the integration.""" + + +class IssueStatusChangedWebhookPayloadDataTypedDict(TypedDict): + change: Change + r"""Why this webhook was sent: the issue was raised or resolved.""" + issue: IssueTypedDict + integration: Nullable[IntegrationTypedDict] + r"""The integration this issue belongs to. `null` for environment-wide issues.""" + + +class IssueStatusChangedWebhookPayloadData(BaseModel): + change: Change + r"""Why this webhook was sent: the issue was raised or resolved.""" + + issue: Issue + + integration: Nullable[Integration] + r"""The integration this issue belongs to. `null` for environment-wide issues.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + + if val != UNSET_SENTINEL: + m[k] = val + + return m + + +class IssueStatusChangedWebhookPayloadTypedDict(TypedDict): + id: str + r"""Unique identifier for this webhook event""" + type: IssueStatusChangedWebhookPayloadType + r"""Type of the webhook event""" + data: IssueStatusChangedWebhookPayloadDataTypedDict + + +class IssueStatusChangedWebhookPayload(BaseModel): + id: str + r"""Unique identifier for this webhook event""" + + type: IssueStatusChangedWebhookPayloadType + r"""Type of the webhook event""" + + data: IssueStatusChangedWebhookPayloadData diff --git a/src/kombo/models/postconnectcreatelinkrequestbody.py b/src/kombo/models/postconnectcreatelinkrequestbody.py index 67f43ab..266f7ed 100644 --- a/src/kombo/models/postconnectcreatelinkrequestbody.py +++ b/src/kombo/models/postconnectcreatelinkrequestbody.py @@ -27,6 +27,7 @@ "cornerstonetalentlink", "recruitee", "recruiterflow", + "atlas", "greenhouse", "greenhousev3", "greenhousejobboard", @@ -134,6 +135,7 @@ "databites", "pageup", "talent360", + "emplypeople", "workdaycustomreport", "workdaycustomreportsftp", "ukgprowfm", @@ -191,6 +193,7 @@ "boondmanager", "haileyhr", "silae", + "skello", "oysterhr", "kiwihr", "square", @@ -211,6 +214,7 @@ "youforce", "nibelis", "peoplexd", + "zellis", "sftp", "sftpfetch", "360learning", diff --git a/src/kombo/models/webhookissuestatuschangedwebhookpayloadop.py b/src/kombo/models/webhookissuestatuschangedwebhookpayloadop.py new file mode 100644 index 0000000..6461e1b --- /dev/null +++ b/src/kombo/models/webhookissuestatuschangedwebhookpayloadop.py @@ -0,0 +1,31 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .issuestatuschangedwebhookpayload import ( + IssueStatusChangedWebhookPayload, + IssueStatusChangedWebhookPayloadTypedDict, +) +from kombo.types import BaseModel +from kombo.utils import FieldMetadata, HeaderMetadata, RequestMetadata +import pydantic +from typing_extensions import Annotated, TypedDict + + +class WebhookIssueStatusChangedWebhookPayloadRequestTypedDict(TypedDict): + x_kombo_signature: str + r"""HMAC signature for webhook verification. See the webhook documentation for details on how to verify this signature.""" + body: IssueStatusChangedWebhookPayloadTypedDict + + +class WebhookIssueStatusChangedWebhookPayloadRequest(BaseModel): + x_kombo_signature: Annotated[ + str, + pydantic.Field(alias="X-Kombo-Signature"), + FieldMetadata(header=HeaderMetadata(style="simple", explode=False)), + ] + r"""HMAC signature for webhook verification. See the webhook documentation for details on how to verify this signature.""" + + body: Annotated[ + IssueStatusChangedWebhookPayload, + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] diff --git a/src/kombo/utils/retries.py b/src/kombo/utils/retries.py index ca7b59e..406c1e7 100644 --- a/src/kombo/utils/retries.py +++ b/src/kombo/utils/retries.py @@ -109,6 +109,18 @@ def __init__(self, inner: Exception): self.inner = inner +_TRANSPORT_ERROR_NAMES = frozenset({"NetworkError", "TimeoutException"}) +_TRANSPORT_ERROR_BASES = frozenset({"TransportError", "RequestError", "HTTPError"}) + + +def _is_transport_error(exception: BaseException) -> bool: + """Report whether an exception is a connection or timeout failure.""" + if isinstance(exception, (httpx.NetworkError, httpx.TimeoutException)): + return True + names = {base.__name__ for base in type(exception).__mro__} + return bool(names & _TRANSPORT_ERROR_NAMES) and _TRANSPORT_ERROR_BASES <= names + + def _parse_retry_after_header(response: httpx.Response) -> Optional[int]: """Parse Retry-After header from response. @@ -207,14 +219,15 @@ def do_request() -> httpx.Response: if res.status_code == parsed_code: raise TemporaryError(res) - except (httpx.NetworkError, httpx.TimeoutException) as exception: - if retries.config.retry_connection_errors: - raise - - raise PermanentError(exception) from exception except TemporaryError: raise except Exception as exception: + if ( + _is_transport_error(exception) + and retries.config.retry_connection_errors + ): + raise + raise PermanentError(exception) from exception return res @@ -252,14 +265,15 @@ async def do_request() -> httpx.Response: if res.status_code == parsed_code: raise TemporaryError(res) - except (httpx.NetworkError, httpx.TimeoutException) as exception: - if retries.config.retry_connection_errors: - raise - - raise PermanentError(exception) from exception except TemporaryError: raise except Exception as exception: + if ( + _is_transport_error(exception) + and retries.config.retry_connection_errors + ): + raise + raise PermanentError(exception) from exception return res @@ -304,6 +318,7 @@ def retry_with_backoff( retry_after_ms = _parse_retry_after_ms_header(exception.response) if retry_after_ms is not None: exception.retry_after = retry_after_ms + exception.response.close() sleep = _get_sleep_interval( exception, initial_interval, @@ -344,6 +359,7 @@ async def retry_with_backoff_async( retry_after_ms = _parse_retry_after_ms_header(exception.response) if retry_after_ms is not None: exception.retry_after = retry_after_ms + await exception.response.aclose() sleep = _get_sleep_interval( exception, initial_interval, diff --git a/src/kombo/utils/values.py b/src/kombo/utils/values.py index dae01a4..ac217f4 100644 --- a/src/kombo/utils/values.py +++ b/src/kombo/utils/values.py @@ -52,9 +52,11 @@ def match_status_codes(status_codes: List[str], status_code: int) -> bool: T = TypeVar("T") + def cast_partial(typ): return partial(cast, typ) + def get_global_from_env( value: Optional[T], env_key: str, type_cast: Callable[[str], T] ) -> Optional[T]: diff --git a/uv.lock b/uv.lock index ba9ca82..e9adea7 100644 --- a/uv.lock +++ b/uv.lock @@ -191,7 +191,7 @@ wheels = [ [[package]] name = "kombo" -version = "1.3.7" +version = "1.4.0" source = { editable = "." } dependencies = [ { name = "httpcore" },