{"suites":{"tier_a":27,"tier_b":50,"heal_v3":64,"heal_v3_hint":64},"tasks":[{"id":"v3_misleading_48_enum+refresh_rotation+idempotency_key_shipments","suite":"heal_v3","tier":"B","title":"Havik Shipments API","goal":"# Havik Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havik.com/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:shipments","base_path","noise","envelope","login_format:form","case:heal3","mutation:add_drift_enum","mutation:add_refresh_rotation","mutation:add_idempotency_key"],"n_requests":13,"requests":[["GET","https://api.havik.com/config.json",200,"application/json"],["POST","https://api.havik.com/v3/sessions",200,"application/json"],["GET","https://api.havik.com/v3/records",200,"application/json"],["GET","https://api.havik.com/v3/records?page=2",200,"application/json"],["GET","https://api.havik.com/v3/records/SHP-99583",200,"application/json"],["POST","https://api.havik.com/v3/records",201,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["PATCH","https://api.havik.com/v3/records/SHP-52524",401,"application/json"],["POST","https://api.havik.com/v3/token/refresh",200,"application/json"],["PATCH","https://api.havik.com/v3/records/SHP-52524",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["DELETE","https://api.havik.com/v3/records/SHP-22537",204,"x-unknown"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.havik.com/config.json\",\n \"headers\": {\n \"host\": \"api.havik.com\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.havik.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havik.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"8f283e24\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}","results":{"c3a":[41.2,100.0,68.6,0.0,17.6,100.0,0.0],"c3b":[41.2,100.0,100.0,0.0,41.2,100.0,58.8]},"fails":{"c3a":[1,-1,0,0,6,-1,1],"c3b":[1,-1,-1,0,1,-1,4]}},{"id":"v3_misleading_49_rename+enum+rate_limit_samples","suite":"heal_v3","tier":"B","title":"Quora Samples API","goal":"# Quora Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quora.co/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:samples","base_path","noise","token_expiry","envelope","login_format:json","csrf_in:header","case:heal3","mutation:add_drift_rename","mutation:add_drift_enum","mutation:add_rate_limit"],"n_requests":14,"requests":[["GET","https://api.quora.co/__flags",200,"application/json"],["POST","https://api.quora.co/api/sessions",200,"application/json"],["GET","https://api.quora.co/api/samples",200,"application/json"],["GET","https://api.quora.co/api/samples?start=10",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.quora.co/api/samples/SMP-46046",200,"application/json"],["POST","https://api.quora.co/api/samples",201,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["PATCH","https://api.quora.co/api/samples/SMP-52694",429,"application/json"],["PATCH","https://api.quora.co/api/samples/SMP-52694",401,"application/json"],["POST","https://api.quora.co/api/sessions",200,"application/json"],["PATCH","https://api.quora.co/api/samples/SMP-52694",200,"application/json"],["DELETE","https://api.quora.co/api/samples/SMP-71892",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.quora.co/__flags\",\n \"headers\": {\n \"host\": \"api.quora.co\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.quora.co\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.quora.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"a1567b32\\\"}\"\n }\n }\n}","results":{"c3a":[0.0,0.0,35.3,5.9,11.8,88.2,17.6],"c3b":[5.9,88.2,94.1,0.0,5.9,5.9,76.5]},"fails":{"c3a":[1,1,3,6,6,10,1],"c3b":[6,10,10,6,6,6,10]}},{"id":"v3_misleading_50_nest+idempotency_key+moved_bookings","suite":"heal_v3","tier":"B","title":"Oriant Bookings API","goal":"# Oriant Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.oriant.app/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:bookings","base_path","noise","login_format:json","csrf_in:header","case:heal3","mutation:add_drift_nest","mutation:add_idempotency_key","mutation:add_moved"],"n_requests":9,"requests":[["POST","https://api.oriant.app/v3/auth/login",200,"application/json"],["GET","https://api.oriant.app/v3/bookings",200,"application/json"],["GET","https://api.oriant.app/static/js/main.e862edae.js",200,"application/javascript"],["GET","https://api.oriant.app/v3/data/bookings/BKG-68815",200,"application/json"],["POST","https://api.oriant.app/v3/bookings",201,"application/json"],["PATCH","https://api.oriant.app/v3/data/bookings/BKG-58073",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-690163237&cid=690163237.690163237&en=page_view",204,"text/plain"],["DELETE","https://api.oriant.app/v3/data/bookings/BKG-34411",204,"x-unknown"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.oriant.app/v3/auth/login\",\n \"headers\": {\n \"host\": \"api.oriant.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.oriant.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.oriant.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_44d245c0\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,11.8,58.8,17.6,17.6,17.6],"c3b":[100.0,100.0,100.0,58.8,100.0,58.8,100.0]},"fails":{"c3a":[6,6,6,11,6,6,6],"c3b":[-1,-1,-1,4,-1,4,-1]}},{"id":"v3_misleading_51_cents+enum+moved_samples","suite":"heal_v3","tier":"B","title":"Traly Samples API","goal":"# Traly Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.traly.app/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:none","domain:samples","base_path","noise","envelope","case:heal3","mutation:add_drift_cents","mutation:add_drift_enum","mutation:add_moved"],"n_requests":7,"requests":[["GET","https://api.traly.app/robots.txt",200,"text/plain"],["GET","https://api.traly.app/v3/samples",200,"application/json"],["GET","https://api.traly.app/v3/data/samples/SMP-60873",200,"application/json"],["POST","https://api.traly.app/v3/samples",201,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["PATCH","https://api.traly.app/v3/data/samples/SMP-54803",200,"application/json"],["DELETE","https://api.traly.app/v3/data/samples/SMP-49388",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.traly.app/v3/samples\",\n \"headers\": {\n \"host\": \"api.traly.app\",\n \"connection\": \"keep-alive\",\n \"x-api-key\": \"sk_61bfea91ceec5cb92d612a0c\",\n \"origin\": \"https://app.traly.app\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.traly.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"SMP-16217\\\",\\\"created_at\\\":\\\"2026-01-05T13:11:00Z\\\",\\\"assay\\\":\\\"ELISA\\\",\\\"lab\\\":\\\"summit\\\",\\\"volume_ul\\\":178.8,\\\"collected_on\\\":\\\"2026-10-29\\\",\\\"batch\\\":\\\"B-3072\\\",\\\"hazardous\\\":false,\\\"total_cents\\\":51798},{\\\"id\\\":\\\"SMP-44205\\\",\\\"created_at\\\":\\\"2026-01-05T15:21:00Z\\\",\\\"assay\\\":\\\"ELISA\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":783.2,\\\"collected_on\\\":\\\"2026-04-08\\\",\\\"batch\\\":\\\"B-5328\\\",\\\"hazardous\\\":false,\\\"total_cents\\\":26327},{\\\"id\\\":\\\"SMP-94924\\\",\\\"created_at\\\":\\\"2026-01-05T17:15:00Z\\\",\\\"assay\\\":\\\"CYTOMETRY\\\",\\\"lab\\\":\\\"harbor\\\",\\\"volume_ul\\\":205.0,\\\"collected_on\\\":\\\"2026-02-01\\\",\\\"batch\\\":\\\"B-9761\\\",\\\"hazardous\\\":false,\\\"total_cents\\\":64956},{\\\"id\\\":\\\"SMP-26327\\\",\\\"created_at\\\":\\\"2026-01-05T18:40:00Z\\\",\\\"assay\\\":\\\"ELISA\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":514.4,\\\"collected_on\\\":\\\"2026-0","results":{"c3a":[17.6,0.0,17.6,100.0,0.0,100.0,17.6],"c3b":[100.0,100.0,100.0,100.0,100.0,35.3,100.0]},"fails":{"c3a":[6,2,6,-1,2,-1,6],"c3b":[-1,-1,-1,-1,-1,2,-1]}},{"id":"v3_misleading_52_epoch+async_create+refresh_rotation_tickets","suite":"heal_v3","tier":"B","title":"Havna Tickets API","goal":"# Havna Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havna.io/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:offset","domain:tickets","base_path","noise","hidden_header","envelope","login_format:json","case:heal3","mutation:add_drift_epoch","mutation:add_async_create","mutation:add_refresh_rotation"],"n_requests":20,"requests":[["POST","https://api.havna.io/v1/auth/token",200,"application/json"],["GET","https://api.havna.io/v1/items",200,"application/json"],["GET","https://api.havna.io/v1/items?start=10",200,"application/json"],["GET","https://api.havna.io/robots.txt",200,"text/plain"],["GET","https://api.havna.io/config.json",200,"application/json"],["GET","https://api.havna.io/v1/items/TCK-74913",200,"application/json"],["GET","https://api.havna.io/manifest.json",200,"application/json"],["POST","https://api.havna.io/v1/items",401,"application/json"],["POST","https://api.havna.io/v1/sessions/refresh",200,"application/json"],["POST","https://api.havna.io/v1/items",202,"application/json"],["GET","https://api.havna.io/v1/tasks/job_2b765a71ae21",200,"application/json"],["GET","https://api.havna.io/v1/tasks/job_2b765a71ae21",200,"application/json"],["GET","https://api.havna.io/v1/tasks/job_2b765a71ae21",401,"application/json"],["POST","https://api.havna.io/v1/sessions/refresh",200,"application/json"],["GET","https://api.havna.io/v1/tasks/job_2b765a71ae21",200,"application/json"],["GET","https://api.havna.io/robots.txt",200,"text/plain"],["PATCH","https://api.havna.io/v1/items/TCK-64326",200,"application/json"],["DELETE","https://api.havna.io/v1/items/TCK-38077",204,"x-unknown"],["GET","https://api.havna.io/",200,"text/html"],["GET","https://api.havna.io/favicon.ico",200,"image/x-icon"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.havna.io/v1/auth/token\",\n \"headers\": {\n \"host\": \"api.havna.io\",\n \"connection\": \"keep-alive\",\n \"x-client-version\": \"3.5.5\",\n \"origin\": \"https://app.havna.io\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havna.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"token\\\":\\\"tok_6ec48cfd8efdae7a7e3943fe\\\",\\\"refresh_token\\\":\\\"rtk_1c6136a7692af5891dc81c76\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,17.6,17.6,17.6],"c3b":[100.0,0.0,72.5,17.6,82.4,100.0,17.6]},"fails":{"c3a":[6,6,6,6,6,6,6],"c3b":[-1,2,6,6,2,-1,3]}},{"id":"v3_misleading_53_rename+cents+rate_limit_shipments","suite":"heal_v3","tier":"B","title":"Nimora Shipments API","goal":"# Nimora Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.nimora.app/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:shipments","base_path","noise","hidden_header","login_format:form","csrf_in:json","case:heal3","mutation:add_drift_rename","mutation:add_drift_cents","mutation:add_rate_limit"],"n_requests":10,"requests":[["POST","https://api.nimora.app/v1/sessions",200,"application/json"],["GET","https://api.nimora.app/v1/shipments",200,"application/json"],["GET","https://api.nimora.app/v1/shipments/SHP-56128",200,"application/json"],["GET","https://api.nimora.app/static/js/main.4b97e269.js",200,"application/javascript"],["POST","https://api.nimora.app/v1/shipments",201,"application/json"],["PATCH","https://api.nimora.app/v1/shipments/SHP-23028",429,"application/json"],["PATCH","https://api.nimora.app/v1/shipments/SHP-23028",200,"application/json"],["POST","https://o38325624.ingest.sentry.io/api/38325624/envelope/?sentry_key=fb4bcb831de37612f7c425ea",200,"application/json"],["DELETE","https://api.nimora.app/v1/shipments/SHP-45352",204,"x-unknown"],["GET","https://static.hotjar.com/c/hotjar-990037103.js?sv=6",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.nimora.app/v1/sessions\",\n \"headers\": {\n \"host\": \"api.nimora.app\",\n \"connection\": \"keep-alive\",\n \"x-client-version\": \"3.14.1\",\n \"origin\": \"https://app.nimora.app\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.nimora.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_a434377f\\\",\\\"csrf_token\\\":\\\"526f60a9407ced07\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,45.1,17.6,17.6,100.0,17.6],"c3b":[100.0,100.0,100.0,17.6,100.0,58.8,100.0]},"fails":{"c3a":[6,6,6,6,4,-1,6],"c3b":[-1,-1,-1,4,-1,4,-1]}},{"id":"v3_misleading_54_epoch+async_create+refresh_rotation_invoices","suite":"heal_v3","tier":"B","title":"Kesrix Invoices API","goal":"# Kesrix Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.kesrix.com/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:invoices","base_path","noise","etag_update","hidden_header","login_format:json","case:heal3","mutation:add_drift_epoch","mutation:add_async_create","mutation:add_refresh_rotation"],"n_requests":19,"requests":[["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.kesrix.com/",200,"text/html"],["POST","https://api.kesrix.com/api/auth/token",200,"application/json"],["GET","https://api.kesrix.com/api/records",200,"application/json"],["GET","https://api.kesrix.com/api/records/INV-66741",200,"application/json"],["GET","https://api.kesrix.com/sockjs-node/info",200,"application/json"],["POST","https://api.kesrix.com/api/records",202,"application/json"],["GET","https://api.kesrix.com/api/operations/job_625555ecc3ec",401,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=943194774&fmt=gif",204,"image/gif"],["POST","https://api.kesrix.com/api/token/refresh",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.kesrix.com/api/operations/job_625555ecc3ec",200,"application/json"],["GET","https://api.kesrix.com/api/operations/job_625555ecc3ec",200,"application/json"],["GET","https://api.kesrix.com/api/records/INV-71443",200,"application/json"],["PATCH","https://api.kesrix.com/api/records/INV-71443",401,"application/json"],["POST","https://api.kesrix.com/api/token/refresh",200,"application/json"],["PATCH","https://api.kesrix.com/api/records/INV-71443",200,"application/json"],["GET","https://api.kesrix.com/static/media/logo.6cf9e3e4.svg",200,"image/svg+xml"],["DELETE","https://api.kesrix.com/api/records/INV-58862",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.kesrix.com/api/auth/token\",\n \"headers\": {\n \"host\": \"api.kesrix.com\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-02-18\",\n \"origin\": \"https://app.kesrix.com\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.kesrix.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"jwt\\\":\\\"tok_7dc502bf42be5ac7bf433f48\\\",\\\"refresh\\\":\\\"rtk_4e20141da05530f18e17ec61\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,17.6,17.6,17.6],"c3b":[82.4,82.4,94.1,82.4,82.4,0.0,82.4]},"fails":{"c3a":[6,6,6,6,6,6,6],"c3b":[2,2,2,2,2,2,2]}},{"id":"v3_misleading_55_nest+enum+rate_limit_bookings","suite":"heal_v3","tier":"B","title":"Solium Bookings API","goal":"# Solium Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.solium.io/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:bookings","base_path","noise","etag_update","case:heal3","mutation:add_drift_nest","mutation:add_drift_enum","mutation:add_rate_limit"],"n_requests":11,"requests":[["GET","https://api.solium.io/api/items",200,"application/json"],["GET","https://api.solium.io/api/items?skip=10",200,"application/json"],["GET","https://api.solium.io/api/items/BKG-32835",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://api.solium.io/api/items",201,"application/json"],["GET","https://api.solium.io/api/items/BKG-78827",200,"application/json"],["PATCH","https://api.solium.io/api/items/BKG-78827",429,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/7a9cfcbac19eae524eeecbf0/analytics.min.js",200,"application/javascript"],["PATCH","https://api.solium.io/api/items/BKG-78827",200,"application/json"],["DELETE","https://api.solium.io/api/items/BKG-76494",204,"x-unknown"],["GET","https://static.hotjar.com/c/hotjar-457999144.js?sv=6",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.solium.io/api/items\",\n \"headers\": {\n \"host\": \"api.solium.io\",\n \"connection\": \"keep-alive\",\n \"x-api-token\": \"sk_46e4bfedd5eae740807ffcc7\",\n \"origin\": \"https://app.solium.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.solium.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"results\\\":[{\\\"id\\\":\\\"BKG-68204\\\",\\\"created_at\\\":\\\"2026-01-05T18:54:00Z\\\",\\\"guest\\\":\\\"Dev Patel\\\",\\\"room\\\":\\\"st_Cedar\\\",\\\"starts_on\\\":\\\"2026-08-24\\\",\\\"nights\\\":13,\\\"party_size\\\":5,\\\"confirmed\\\":false,\\\"requester\\\":{\\\"name\\\":\\\"Kofi Mensah\\\",\\\"email\\\":\\\"sofia.duarte@example.org\\\"}},{\\\"id\\\":\\\"BKG-39297\\\",\\\"created_at\\\":\\\"2026-01-05T20:22:00Z\\\",\\\"guest\\\":\\\"Marta Lindqvist\\\",\\\"room\\\":\\\"st_Dune\\\",\\\"starts_on\\\":\\\"2026-05-30\\\",\\\"nights\\\":9,\\\"party_size\\\":5,\\\"confirmed\\\":false,\\\"requester\\\":{\\\"name\\\":\\\"Ines Varga\\\",\\\"email\\\":\\\"sofia.duarte@mail.test\\\"}},{\\\"id\\\":\\\"BKG-16600\\\",\\\"created_at\\\":\\\"2026-01-05T21:55:00Z\\\",\\\"guest\\\":\\\"Ines Varga\\\",\\\"room\\\":\\\"st_Ember\\\",\\\"starts_on\\\":\\\"2026-04-05\\\",\\\"nights\\\":6,\\\"party_size\\\":7,\\\"confirmed\\\":true,\\\"requester\\\":{\\\"name\\\":\\\"Lena Brandt\\\",\\\"email\\\":\\\"ravi.menon@exampl","results":{"c3a":[17.6,17.6,45.1,17.6,17.6,100.0,100.0],"c3b":[100.0,88.2,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,6,6,-1,-1],"c3b":[-1,6,-1,-1,-1,-1,-1]}},{"id":"v3_partial_32_rename+async_create+moved_shipments","suite":"heal_v3","tier":"B","title":"Zanna Shipments API","goal":"# Zanna Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.zanna.app/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:link_header","domain:shipments","base_path","noise","token_expiry","hidden_header","login_format:json","csrf_in:header","case:heal3","mutation:add_drift_rename","mutation:add_async_create","mutation:add_moved"],"n_requests":13,"requests":[["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-798927952&cid=798927952.798927952&en=page_view",204,"text/plain"],["POST","https://api.zanna.app/v1/auth/login",200,"application/json"],["GET","https://api.zanna.app/v1/shipments",200,"application/json"],["GET","https://api.zanna.app/v1/shipments?p=2",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.zanna.app/sockjs-node/info",200,"application/json"],["GET","https://api.zanna.app/static/media/logo.7134cefe.svg",200,"image/svg+xml"],["GET","https://api.zanna.app/v1/entities/shipments/SHP-21212",200,"application/json"],["POST","https://api.zanna.app/v1/shipments",202,"application/json"],["GET","https://api.zanna.app/v1/tasks/job_98cb69786fd0",401,"application/json"],["POST","https://api.zanna.app/v1/auth/login",200,"application/json"],["GET","https://api.zanna.app/v1/tasks/job_98cb69786fd0",200,"application/json"],["GET","https://api.zanna.app/v1/tasks/job_98cb69786fd0",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.zanna.app/v1/auth/login\",\n \"headers\": {\n \"host\": \"api.zanna.app\",\n \"connection\": \"keep-alive\",\n \"x-client-version\": \"4.3.4\",\n \"origin\": \"https://app.zanna.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.zanna.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_b39e265b\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,0.0,0.0,17.6,17.6],"c3b":[100.0,82.4,100.0,0.0,0.0,100.0,17.6]},"fails":{"c3a":[6,6,6,0,0,2,6],"c3b":[-1,2,-1,0,0,-1,6]}},{"id":"v3_partial_33_cents+enum+refresh_rotation_invoices","suite":"heal_v3","tier":"B","title":"Brora Invoices API","goal":"# Brora Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.brora.app/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:invoices","base_path","noise","etag_update","login_format:form","case:heal3","mutation:add_drift_cents","mutation:add_drift_enum","mutation:add_refresh_rotation"],"n_requests":11,"requests":[["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://api.brora.app/api/auth/login",200,"application/json"],["GET","https://api.brora.app/api/records",200,"application/json"],["GET","https://api.brora.app/favicon.ico",200,"image/x-icon"],["GET","https://api.brora.app/api/records",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.brora.app/api/records",200,"application/json"],["GET","https://api.brora.app/api/records",200,"application/json"],["GET","https://api.brora.app/api/records",401,"application/json"],["POST","https://api.brora.app/api/auth/refresh",200,"application/json"],["GET","https://api.brora.app/api/records",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.brora.app/api/auth/login\",\n \"headers\": {\n \"host\": \"api.brora.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.brora.app\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.brora.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"token\\\":\\\"tok_1033d7a209526215b6070b2a\\\",\\\"refresh_token\\\":\\\"rtk_069fdd780177c8b5fd1acd2f\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,51.0,58.8,58.8,58.8,58.8],"c3b":[94.1,47.1,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,1,5,5,1,5],"c3b":[4,10,-1,-1,-1,-1,-1]}},{"id":"v3_partial_34_nest+async_create+idempotency_key_samples","suite":"heal_v3","tier":"B","title":"Traton Samples API","goal":"# Traton Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.traton.dev/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:samples","base_path","noise","hidden_header","case:heal3","mutation:add_drift_nest","mutation:add_async_create","mutation:add_idempotency_key"],"n_requests":7,"requests":[["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.traton.dev/v3/items",200,"application/json"],["GET","https://api.traton.dev/v3/items?offset=10",200,"application/json"],["POST","https://api.traton.dev/v3/items",202,"application/json"],["POST","https://o131564859.ingest.sentry.io/api/131564859/envelope/?sentry_key=267e29190b9d54c26b70c477",200,"application/json"],["GET","https://api.traton.dev/v3/operations/job_7a91447f74cd",200,"application/json"],["GET","https://api.traton.dev/v3/operations/job_7a91447f74cd",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.traton.dev/v3/items\",\n \"headers\": {\n \"host\": \"api.traton.dev\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-02-18\",\n \"x-api-token\": \"sk_d978a699660456285e0bc0a8\",\n \"origin\": \"https://app.traton.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.traton.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"records\\\":[{\\\"id\\\":\\\"SMP-81994\\\",\\\"created_at\\\":\\\"2026-01-05T13:50:00Z\\\",\\\"assay\\\":\\\"mass_spec\\\",\\\"lab\\\":\\\"harbor\\\",\\\"volume_ul\\\":68.7,\\\"collected_on\\\":\\\"2026-05-17\\\",\\\"batch\\\":\\\"B-9614\\\",\\\"hazardous\\\":false,\\\"owner\\\":{\\\"name\\\":\\\"Elin Berg\\\",\\\"email\\\":\\\"kofi.mensah@corp.test\\\"}},{\\\"id\\\":\\\"SMP-52432\\\",\\\"created_at\\\":\\\"2026-01-05T15:59:00Z\\\",\\\"assay\\\":\\\"cytometry\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":133.4,\\\"collected_on\\\":\\\"2026-03-10\\\",\\\"batch\\\":\\\"B-3709\\\",\\\"hazardous\\\":false,\\\"owner\\\":{\\\"name\\\":\\\"Ines Varga\\\",\\\"email\\\":\\\"amara.okoye@corp.test\\\"}},{\\\"id\\\":\\\"SMP-21597\\\",\\\"created_at\\\":\\\"2026-01-05T16:15:00Z\\\",\\\"assay\\\":\\\"pcr\\\",\\\"lab\\\":\\\"north\\\",\\\"volume_ul\\\":802.4,\\\"collected_on\\\":\\\"2026-03-25\\\",\\\"batch\\\":\\\"B-3983\\\",\\\"hazardous\\\":false,\\\"owner\\\":{\\\"name\\\":\\\"Tom","results":{"c3a":[41.2,0.0,27.5,0.0,41.2,41.2,41.2],"c3b":[41.2,41.2,58.8,41.2,58.8,82.4,41.2]},"fails":{"c3a":[1,1,1,1,1,1,1],"c3b":[1,1,1,1,1,1,1]}},{"id":"v3_partial_35_epoch+nest+refresh_rotation_shipments","suite":"heal_v3","tier":"B","title":"Brora Shipments API","goal":"# Brora Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.brora.net/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:shipments","base_path","noise","envelope","login_format:form","case:heal3","mutation:add_drift_epoch","mutation:add_drift_nest","mutation:add_refresh_rotation"],"n_requests":13,"requests":[["GET","https://api.brora.net/config.json",200,"application/json"],["GET","https://api.brora.net/favicon.ico",200,"image/x-icon"],["POST","https://api.brora.net/v1/auth/login",200,"application/json"],["GET","https://api.brora.net/v1/records",200,"application/json"],["GET","https://api.brora.net/v1/records?p=2",200,"application/json"],["GET","https://api.brora.net/v1/records",200,"application/json"],["GET","https://api.brora.net/v1/records?p=2",200,"application/json"],["GET","https://api.brora.net/static/js/main.4419aed2.js",200,"application/javascript"],["GET","https://api.brora.net/v1/records",401,"application/json"],["POST","https://api.brora.net/v1/sessions/refresh",200,"application/json"],["GET","https://api.brora.net/v1/records",200,"application/json"],["GET","https://api.brora.net/v1/records?p=2",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.brora.net/config.json\",\n \"headers\": {\n \"host\": \"api.brora.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.brora.net\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.brora.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"e9e32811\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}","results":{"c3a":[58.8,58.8,45.1,0.0,0.0,58.8,17.6],"c3b":[100.0,100.0,100.0,0.0,0.0,0.0,17.6]},"fails":{"c3a":[11,11,11,0,0,11,6],"c3b":[-1,-1,-1,0,0,0,6]}},{"id":"v3_partial_36_enum+rate_limit+moved_tickets","suite":"heal_v3","tier":"B","title":"Keslo Tickets API","goal":"# Keslo Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.keslo.com/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:tickets","base_path","noise","token_expiry","etag_update","login_format:form","csrf_in:header","case:heal3","mutation:add_drift_enum","mutation:add_rate_limit","mutation:add_moved"],"n_requests":7,"requests":[["POST","https://api.keslo.com/v1/auth/login",200,"application/json"],["GET","https://api.keslo.com/v1/records",200,"application/json"],["GET","https://api.keslo.com/v1/records?offset=10",200,"application/json"],["GET","https://api.keslo.com/static/js/main.86b84b05.js",200,"application/javascript"],["GET","https://api.keslo.com/v1/entities/records/TCK-21564",429,"application/json"],["GET","https://api.keslo.com/v1/entities/records/TCK-21564",200,"application/json"],["POST","https://o384308270.ingest.sentry.io/api/384308270/envelope/?sentry_key=31cd212c0aae6addc52b2897",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.keslo.com/v1/auth/login\",\n \"headers\": {\n \"host\": \"api.keslo.com\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.keslo.com\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.keslo.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_1aee5b15\\\"}\"\n }\n }\n}","results":{"c3a":[0.0,17.6,11.8,0.0,0.0,0.0,0.0],"c3b":[0.0,0.0,0.0,0.0,0.0,0.0,0.0]},"fails":{"c3a":[10,2,10,10,10,10,10],"c3b":[10,10,10,10,10,10,10]}},{"id":"v3_partial_37_rename+cents+idempotency_key_bookings","suite":"heal_v3","tier":"B","title":"Havdex Bookings API","goal":"# Havdex Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havdex.co/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:bookings","base_path","noise","hidden_header","envelope","case:heal3","mutation:add_drift_rename","mutation:add_drift_cents","mutation:add_idempotency_key"],"n_requests":4,"requests":[["GET","https://api.havdex.co/v2/items",200,"application/json"],["GET","https://api.havdex.co/v2/items?cursor=OTY4YjgzYWM6MTA",200,"application/json"],["POST","https://api.havdex.co/v2/items",201,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.havdex.co/v2/items\",\n \"headers\": {\n \"host\": \"api.havdex.co\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-1.8\",\n \"x-api-key\": \"sk_f42102d685e756166922dd21\",\n \"origin\": \"https://app.havdex.co\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havdex.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"BKG-50306\\\",\\\"created_at\\\":\\\"2026-01-05T10:35:00Z\\\",\\\"guest_name\\\":\\\"Ravi Menon\\\",\\\"room\\\":\\\"Ember\\\",\\\"starts_on\\\":\\\"2026-12-17\\\",\\\"nights\\\":4,\\\"party_size\\\":7,\\\"confirmed\\\":true,\\\"total_cents\\\":77741},{\\\"id\\\":\\\"BKG-96445\\\",\\\"created_at\\\":\\\"2026-01-05T12:30:00Z\\\",\\\"guest_name\\\":\\\"Tomas Ito\\\",\\\"room\\\":\\\"Birch\\\",\\\"starts_on\\\":\\\"2026-11-06\\\",\\\"nights\\\":14,\\\"party_size\\\":8,\\\"confirmed\\\":true,\\\"total_cents\\\":61327},{\\\"id\\\":\\\"BKG-52416\\\",\\\"created_at\\\":\\\"2026-01-05T13:40:00Z\\\",\\\"guest_name\\\":\\\"Elin Berg\\\",\\\"room\\\":\\\"Birch\\\",\\\"starts_on\\\":\\\"2026-11-24\\\",\\\"nights\\\":9,\\\"party_size\\\":4,\\\"confirmed\\\":false,\\\"total_cents\\\":42636},{\\\"id\\\":\\\"BKG-40331\\\",\\\"created_at\\\":\\\"2026-01-05T15:12:00Z\\\",\\\"guest_name\\\":\\\"Ines Varga\\\",\\\"room\\\":\\\"Aurora\\\",\\\"starts_on\\\":\\\"2026-0","results":{"c3a":[41.2,17.6,25.5,0.0,0.0,41.2,41.2],"c3b":[0.0,41.2,58.8,41.2,0.0,0.0,41.2]},"fails":{"c3a":[1,6,1,1,1,1,1],"c3b":[1,1,1,1,1,1,1]}},{"id":"v3_partial_38_nest+refresh_rotation+idempotency_key_samples","suite":"heal_v3","tier":"B","title":"Pelora Samples API","goal":"# Pelora Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pelora.net/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:samples","base_path","noise","envelope","login_format:form","case:heal3","mutation:add_drift_nest","mutation:add_refresh_rotation","mutation:add_idempotency_key"],"n_requests":11,"requests":[["POST","https://api.pelora.net/api/auth/token",200,"application/json"],["GET","https://api.pelora.net/api/items",200,"application/json"],["GET","https://api.pelora.net/api/items?after=YjY4ZjUwYWU6MTA",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.pelora.net/api/items",201,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.pelora.net/api/items",200,"application/json"],["GET","https://api.pelora.net/api/items?after=YjY4ZjUwYWU6MTA",401,"application/json"],["POST","https://api.pelora.net/api/token/refresh",200,"application/json"],["GET","https://api.pelora.net/api/items?after=YjY4ZjUwYWU6MTA",200,"application/json"],["POST","https://o253655190.ingest.sentry.io/api/253655190/envelope/?sentry_key=00fa9e603c602ba5477bbfc5",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.pelora.net/api/auth/token\",\n \"headers\": {\n \"host\": \"api.pelora.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.pelora.net\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pelora.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"jwt\\\":\\\"tok_69601773eeb4949d2fe74267\\\",\\\"refresh_token\\\":\\\"rtk_7926103fb6b0d19147c5c34f\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c3b":[0.0,0.0,0.0,0.0,0.0,0.0,0.0]},"fails":{"c3a":[1,1,1,1,1,1,1],"c3b":[1,1,1,1,1,1,1]}},{"id":"v3_partial_39_epoch+enum+moved_invoices","suite":"heal_v3","tier":"B","title":"Traly Invoices API","goal":"# Traly Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.traly.io/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:invoices","base_path","noise","etag_update","envelope","login_format:form","csrf_in:json","case:heal3","mutation:add_drift_epoch","mutation:add_drift_enum","mutation:add_moved"],"n_requests":6,"requests":[["GET","https://api.traly.io/robots.txt",200,"text/plain"],["POST","https://api.traly.io/v3/login",200,"application/json"],["GET","https://api.traly.io/v3/records",200,"application/json"],["GET","https://api.traly.io/v3/records?offset=10",200,"application/json"],["GET","https://api.traly.io/v3/entities/records/INV-35620",200,"application/json"],["GET","https://api.traly.io/static/css/main.e0f6439b.css",200,"text/css"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.traly.io/v3/login\",\n \"headers\": {\n \"host\": \"api.traly.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.traly.io\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.traly.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_664929e8\\\",\\\"csrf_token\\\":\\\"732c5c7eb23659c2\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,45.1,58.8,17.6,58.8,17.6],"c3b":[82.4,100.0,66.7,100.0,17.6,17.6,41.2]},"fails":{"c3a":[1,1,1,1,12,1,1],"c3b":[2,-1,7,-1,6,1,4]}},{"id":"v3_release3_14_cents+rate_limit+refresh_rotation_shipments","suite":"heal_v3","tier":"B","title":"Velly Shipments API","goal":"# Velly Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.velly.io/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:shipments","base_path","noise","etag_update","envelope","login_format:json","case:heal3","mutation:add_drift_cents","mutation:add_rate_limit","mutation:add_refresh_rotation"],"n_requests":14,"requests":[["POST","https://o123098785.ingest.sentry.io/api/123098785/envelope/?sentry_key=dd5f62b399b23c4971650d76",200,"application/json"],["POST","https://api.velly.io/api/sessions",200,"application/json"],["GET","https://api.velly.io/api/records",200,"application/json"],["GET","https://api.velly.io/ping",200,"application/json"],["GET","https://api.velly.io/api/records/SHP-47648",200,"application/json"],["POST","https://api.velly.io/api/records",201,"application/json"],["POST","https://o165592550.ingest.sentry.io/api/165592550/envelope/?sentry_key=d4b355fa72a028ac82697baf",200,"application/json"],["GET","https://api.velly.io/static/js/main.d313e12f.js",200,"application/javascript"],["GET","https://api.velly.io/api/records/SHP-38871",200,"application/json"],["PATCH","https://api.velly.io/api/records/SHP-38871",429,"application/json"],["PATCH","https://api.velly.io/api/records/SHP-38871",401,"application/json"],["POST","https://api.velly.io/api/auth/refresh",200,"application/json"],["PATCH","https://api.velly.io/api/records/SHP-38871",200,"application/json"],["DELETE","https://api.velly.io/api/records/SHP-46492",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o123098785.ingest.sentry.io/api/123098785/envelope/?sentry_key=dd5f62b399b23c4971650d76\",\n \"headers\": {\n \"host\": \"o123098785.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.velly.io\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.velly.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"9551cb031819af3fce78d1d7\\\"}\"\n }\n }\n}","results":{"c3a":[11.8,11.8,3.9,23.5,23.5,23.5,23.5],"c3b":[0.0,11.8,88.2,23.5,0.0,23.5,23.5]},"fails":{"c3a":[6,6,6,10,10,10,10],"c3b":[6,6,10,10,2,10,10]}},{"id":"v3_release3_15_epoch+enum+idempotency_key_shipments","suite":"heal_v3","tier":"B","title":"Pelton Shipments API","goal":"# Pelton Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pelton.io/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:none","domain:shipments","base_path","noise","etag_update","hidden_header","case:heal3","mutation:add_drift_epoch","mutation:add_drift_enum","mutation:add_idempotency_key"],"n_requests":9,"requests":[["GET","https://api.pelton.io/api/shipments",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=261353514&fmt=gif",204,"image/gif"],["GET","https://api.pelton.io/api/shipments/SHP-55873",200,"application/json"],["POST","https://api.pelton.io/api/shipments",201,"application/json"],["GET","https://api.pelton.io/api/shipments/SHP-20652",200,"application/json"],["PATCH","https://api.pelton.io/api/shipments/SHP-20652",200,"application/json"],["DELETE","https://api.pelton.io/api/shipments/SHP-10612",204,"x-unknown"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-463307581&cid=463307581.463307581&en=page_view",204,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.pelton.io/api/shipments\",\n \"headers\": {\n \"host\": \"api.pelton.io\",\n \"connection\": \"keep-alive\",\n \"x-app-build\": \"1457\",\n \"api-key\": \"sk_164f2cdad539330cbe806ce0\",\n \"origin\": \"https://app.pelton.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pelton.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"[{\\\"id\\\":\\\"SHP-28727\\\",\\\"created_at\\\":1767636000,\\\"carrier\\\":\\\"Northwind Freight\\\",\\\"status\\\":\\\"RETURNED\\\",\\\"origin\\\":\\\"Valparaiso\\\",\\\"destination\\\":\\\"Quito\\\",\\\"weight_kg\\\":325.4,\\\"fragile\\\":true,\\\"eta_days\\\":4},{\\\"id\\\":\\\"SHP-10612\\\",\\\"created_at\\\":1767637500,\\\"carrier\\\":\\\"Tidewater Express\\\",\\\"status\\\":\\\"PENDING\\\",\\\"origin\\\":\\\"Tallinn\\\",\\\"destination\\\":\\\"Valparaiso\\\",\\\"weight_kg\\\":323.3,\\\"fragile\\\":true,\\\"eta_days\\\":6},{\\\"id\\\":\\\"SHP-58893\\\",\\\"created_at\\\":1767639060,\\\"carrier\\\":\\\"Northwind Freight\\\",\\\"status\\\":\\\"RETURNED\\\",\\\"origin\\\":\\\"Tallinn\\\",\\\"destination\\\":\\\"Ghent\\\",\\\"weight_kg\\\":12.8,\\\"fragile\\\":false,\\\"eta_days\\\":4},{\\\"id\\\":\\\"SHP-66159\\\",\\\"created_at\\\":1767642240,\\\"carrier\\\":\\\"Tidewater Express\\\",\\\"status\\\":\\\"RETURNED\\\",\\\"origin\\\":\\\"Nairobi\\\",\\\"destination\\\":\\\"L","results":{"c3a":[17.6,0.0,27.5,47.1,47.1,47.1,17.6],"c3b":[0.0,41.2,72.5,41.2,17.6,41.2,17.6]},"fails":{"c3a":[1,1,1,1,1,1,1],"c3b":[1,1,1,1,1,1,1]}},{"id":"v3_release3_16_nest+async_create+moved_bookings","suite":"heal_v3","tier":"B","title":"Fenton Bookings API","goal":"# Fenton Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.fenton.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:bookings","base_path","noise","token_expiry","etag_update","login_format:json","csrf_in:json","case:heal3","mutation:add_drift_nest","mutation:add_async_create","mutation:add_moved"],"n_requests":21,"requests":[["POST","https://o305368798.ingest.sentry.io/api/305368798/envelope/?sentry_key=72ffeb2e4c82a8dfbff30876",200,"application/json"],["POST","https://api.fenton.dev/v2/login",200,"application/json"],["GET","https://api.fenton.dev/v2/records",200,"application/json"],["GET","https://api.fenton.dev/v2/records?offset=10",200,"application/json"],["POST","https://o712346893.ingest.sentry.io/api/712346893/envelope/?sentry_key=d35fe540c34f1091c07a2845",200,"application/json"],["GET","https://api.fenton.dev/v2/data/records/BKG-95092",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://api.fenton.dev/v2/records",202,"application/json"],["GET","https://api.fenton.dev/v2/operations/job_321dfcf8cde9",401,"application/json"],["POST","https://api.fenton.dev/v2/login",200,"application/json"],["GET","https://api.fenton.dev/v2/operations/job_321dfcf8cde9",200,"application/json"],["GET","https://api.fenton.dev/v2/operations/job_321dfcf8cde9",200,"application/json"],["GET","https://api.fenton.dev/v2/operations/job_321dfcf8cde9",200,"application/json"],["GET","https://api.fenton.dev/",200,"text/html"],["GET","https://api.fenton.dev/v2/data/records/BKG-19608",200,"application/json"],["PATCH","https://api.fenton.dev/v2/data/records/BKG-19608",401,"application/json"],["POST","https://api.fenton.dev/v2/login",200,"application/json"],["PATCH","https://api.fenton.dev/v2/data/records/BKG-19608",200,"application/json"],["GET","https://api.fenton.dev/config.json",200,"application/json"],["DELETE","https://api.fenton.dev/v2/data/records/BKG-60157",204,"x-unknown"],["GET","https://api.fenton.dev/robots.txt",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o305368798.ingest.sentry.io/api/305368798/envelope/?sentry_key=72ffeb2e4c82a8dfbff30876\",\n \"headers\": {\n \"host\": \"o305368798.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.fenton.dev\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.fenton.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"22a4c7e1c13da6781526525e\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,58.8,17.6,17.6],"c3b":[64.7,100.0,100.0,64.7,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,6,11,6,6],"c3b":[2,-1,-1,4,-1,-1,-1]}},{"id":"v3_release3_17_rename+nest+idempotency_key_samples","suite":"heal_v3","tier":"B","title":"Oriant Samples API","goal":"# Oriant Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.oriant.io/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:samples","base_path","noise","etag_update","envelope","case:heal3","mutation:add_drift_rename","mutation:add_drift_nest","mutation:add_idempotency_key"],"n_requests":10,"requests":[["GET","https://api.oriant.io/static/css/main.b1cf0fbc.css",200,"text/css"],["GET","https://api.oriant.io/v3/items",200,"application/json"],["GET","https://api.oriant.io/v3/items?after=NjQ2MjE1YTM6MTA",200,"application/json"],["GET","https://api.oriant.io/v3/items/SMP-26522",200,"application/json"],["POST","https://api.oriant.io/v3/items",201,"application/json"],["GET","https://api.oriant.io/static/css/main.51a36e32.css",200,"text/css"],["GET","https://api.oriant.io/v3/items/SMP-54933",200,"application/json"],["PATCH","https://api.oriant.io/v3/items/SMP-54933",200,"application/json"],["DELETE","https://api.oriant.io/v3/items/SMP-45330",204,"x-unknown"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-699691935&cid=699691935.699691935&en=page_view",204,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.oriant.io/v3/items\",\n \"headers\": {\n \"host\": \"api.oriant.io\",\n \"connection\": \"keep-alive\",\n \"api-key\": \"sk_5987aea11186d9d7eed043a7\",\n \"origin\": \"https://app.oriant.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.oriant.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"SMP-16075\\\",\\\"created_at\\\":\\\"2026-01-05T18:25:00Z\\\",\\\"assay\\\":\\\"cytometry\\\",\\\"lab\\\":\\\"harbor\\\",\\\"volume_ul\\\":783.2,\\\"sampled_on\\\":\\\"2026-02-17\\\",\\\"batch\\\":\\\"B-9112\\\",\\\"hazardous\\\":false,\\\"requester\\\":{\\\"name\\\":\\\"Sofia Duarte\\\",\\\"email\\\":\\\"lena.brandt@mail.test\\\"}},{\\\"id\\\":\\\"SMP-45330\\\",\\\"created_at\\\":\\\"2026-01-05T18:42:00Z\\\",\\\"assay\\\":\\\"elisa\\\",\\\"lab\\\":\\\"harbor\\\",\\\"volume_ul\\\":167.8,\\\"sampled_on\\\":\\\"2026-03-20\\\",\\\"batch\\\":\\\"B-1957\\\",\\\"hazardous\\\":true,\\\"requester\\\":{\\\"name\\\":\\\"Tomas Ito\\\",\\\"email\\\":\\\"sofia.duarte@example.org\\\"}},{\\\"id\\\":\\\"SMP-63048\\\",\\\"created_at\\\":\\\"2026-01-05T19:37:00Z\\\",\\\"assay\\\":\\\"mass_spec\\\",\\\"lab\\\":\\\"harbor\\\",\\\"volume_ul\\\":513.1,\\\"sampled_on\\\":\\\"2026-06-04\\\",\\\"batch\\\":\\\"B-5085\\\",\\\"hazardous\\\":false,\\\"requester\\\":{\\\"name\\\":\\\"Marta Lindqvist\\\",\\\"email\\\":\\\"tomas.","results":{"c3a":[0.0,82.4,45.1,17.6,58.8,58.8,17.6],"c3b":[41.2,41.2,80.4,82.4,82.4,100.0,17.6]},"fails":{"c3a":[1,1,6,6,11,11,6],"c3b":[1,1,1,1,1,-1,6]}},{"id":"v3_release3_18_epoch+async_create+moved_invoices","suite":"heal_v3","tier":"B","title":"Broton Invoices API","goal":"# Broton Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.broton.co/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:invoices","base_path","noise","etag_update","login_format:json","csrf_in:json","case:heal3","mutation:add_drift_epoch","mutation:add_async_create","mutation:add_moved"],"n_requests":16,"requests":[["POST","https://api.broton.co/api/login",200,"application/json"],["GET","https://api.broton.co/api/records",200,"application/json"],["GET","https://api.broton.co/api/records?after=ZjMxY2MxOGU6MTA",200,"application/json"],["GET","https://api.broton.co/static/css/main.e35171ac.css",200,"text/css"],["GET","https://api.broton.co/api/entities/records/INV-93317",200,"application/json"],["POST","https://api.broton.co/api/records",202,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.broton.co/manifest.json",200,"application/json"],["GET","https://api.broton.co/api/jobs/job_9af5f8a67d14",200,"application/json"],["GET","https://api.broton.co/api/jobs/job_9af5f8a67d14",200,"application/json"],["GET","https://api.broton.co/api/jobs/job_9af5f8a67d14",200,"application/json"],["GET","https://api.broton.co/api/entities/records/INV-63604",200,"application/json"],["PATCH","https://api.broton.co/api/entities/records/INV-63604",200,"application/json"],["DELETE","https://api.broton.co/api/entities/records/INV-94727",204,"x-unknown"],["GET","https://api.broton.co/sockjs-node/info",200,"application/json"],["GET","https://api.broton.co/",200,"text/html"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.broton.co/api/login\",\n \"headers\": {\n \"host\": \"api.broton.co\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.broton.co\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.broton.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_5a3eb7b5\\\",\\\"csrf_token\\\":\\\"ad1a3fcf9a8ad92a\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,100.0,17.6,100.0,17.6],"c3b":[100.0,100.0,66.7,17.6,17.6,17.6,100.0]},"fails":{"c3a":[6,6,6,-1,6,-1,6],"c3b":[-1,-1,7,6,6,6,-1]}},{"id":"v3_release3_19_rename+enum+refresh_rotation_tickets","suite":"heal_v3","tier":"B","title":"Orilo Tickets API","goal":"# Orilo Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.orilo.io/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:tickets","base_path","noise","etag_update","login_format:json","case:heal3","mutation:add_drift_rename","mutation:add_drift_enum","mutation:add_refresh_rotation"],"n_requests":14,"requests":[["GET","https://api.orilo.io/__flags",200,"application/json"],["POST","https://api.orilo.io/api/auth/token",200,"application/json"],["GET","https://api.orilo.io/api/records",200,"application/json"],["GET","https://api.orilo.io/api/records?p=2",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.orilo.io/api/records/TCK-26398",200,"application/json"],["POST","https://api.orilo.io/api/records",201,"application/json"],["GET","https://api.orilo.io/api/records/TCK-10545",401,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.orilo.io/api/token/refresh",200,"application/json"],["GET","https://api.orilo.io/api/records/TCK-10545",200,"application/json"],["PATCH","https://api.orilo.io/api/records/TCK-10545",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["DELETE","https://api.orilo.io/api/records/TCK-99949",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.orilo.io/__flags\",\n \"headers\": {\n \"host\": \"api.orilo.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.orilo.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.orilo.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"127f9939\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,0.0,47.1,70.6,17.6],"c3b":[17.6,100.0,100.0,0.0,0.0,17.6,17.6]},"fails":{"c3a":[1,1,1,0,1,1,1],"c3b":[6,-1,-1,0,0,1,1]}},{"id":"v3_release3_20_cents+rate_limit+moved_samples","suite":"heal_v3","tier":"B","title":"Daxdex Samples API","goal":"# Daxdex Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.daxdex.dev/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:samples","base_path","noise","hidden_header","envelope","login_format:json","csrf_in:json","case:heal3","mutation:add_drift_cents","mutation:add_rate_limit","mutation:add_moved"],"n_requests":11,"requests":[["POST","https://api.daxdex.dev/api/login",200,"application/json"],["GET","https://api.daxdex.dev/api/items",200,"application/json"],["GET","https://api.daxdex.dev/api/items?cursor=OTc5YWNhMzU6MTA",200,"application/json"],["POST","https://o941069209.ingest.sentry.io/api/941069209/envelope/?sentry_key=74ca0069203265f90e8a0ca6",200,"application/json"],["GET","https://api.daxdex.dev/api/rest/items/SMP-80810",200,"application/json"],["POST","https://api.daxdex.dev/api/items",201,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-836867195&cid=836867195.836867195&en=page_view",204,"text/plain"],["PATCH","https://api.daxdex.dev/api/rest/items/SMP-62519",429,"application/json"],["PATCH","https://api.daxdex.dev/api/rest/items/SMP-62519",200,"application/json"],["DELETE","https://api.daxdex.dev/api/rest/items/SMP-27091",204,"x-unknown"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-818431058&cid=818431058.818431058&en=page_view",204,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.daxdex.dev/api/login\",\n \"headers\": {\n \"host\": \"api.daxdex.dev\",\n \"connection\": \"keep-alive\",\n \"x-app-build\": \"6378\",\n \"origin\": \"https://app.daxdex.dev\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.daxdex.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_ce7c3cff\\\",\\\"csrf_token\\\":\\\"78f86399748e3d4c\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,5.9,17.6,58.8,0.0],"c3b":[100.0,100.0,100.0,5.9,5.9,100.0,5.9]},"fails":{"c3a":[6,6,6,10,6,11,10],"c3b":[-1,-1,-1,10,10,-1,10]}},{"id":"v3_release3_21_nest+enum+async_create_tickets","suite":"heal_v3","tier":"B","title":"Quoly Tickets API","goal":"# Quoly Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quoly.io/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:tickets","base_path","noise","etag_update","case:heal3","mutation:add_drift_nest","mutation:add_drift_enum","mutation:add_async_create"],"n_requests":13,"requests":[["GET","https://api.quoly.io/manifest.json",200,"application/json"],["GET","https://api.quoly.io/v2/items",200,"application/json"],["GET","https://api.quoly.io/v2/items?start=10",200,"application/json"],["GET","https://api.quoly.io/v2/items/TCK-48544",200,"application/json"],["POST","https://api.quoly.io/v2/items",202,"application/json"],["GET","https://api.quoly.io/v2/jobs/job_b0c5ac171458",200,"application/json"],["GET","https://api.quoly.io/v2/jobs/job_b0c5ac171458",200,"application/json"],["GET","https://api.quoly.io/v2/items/TCK-39436",200,"application/json"],["PATCH","https://api.quoly.io/v2/items/TCK-39436",200,"application/json"],["GET","https://api.quoly.io/",200,"text/html"],["DELETE","https://api.quoly.io/v2/items/TCK-57950",204,"x-unknown"],["GET","https://api.quoly.io/config.json",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.quoly.io/manifest.json\",\n \"headers\": {\n \"host\": \"api.quoly.io\",\n \"connection\": \"keep-alive\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"manifest\",\n \"referer\": \"https://app.quoly.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"short_name\\\":\\\"App\\\",\\\"start_url\\\":\\\".\\\",\\\"display\\\":\\\"standalone\\\",\\\"icons\\\":[]}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,45.1,17.6,17.6,100.0,17.6],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,6,6,-1,6]}},{"id":"v3_release3_22_rename+rate_limit+idempotency_key_bookings","suite":"heal_v3","tier":"B","title":"Pelra Bookings API","goal":"# Pelra Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pelra.net/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:bookings","base_path","noise","token_expiry","etag_update","envelope","login_format:json","csrf_in:json","case:heal3","mutation:add_drift_rename","mutation:add_rate_limit","mutation:add_idempotency_key"],"n_requests":16,"requests":[["GET","https://api.pelra.net/static/media/logo.3ad8ef07.svg",200,"image/svg+xml"],["POST","https://api.pelra.net/v3/sessions",200,"application/json"],["GET","https://api.pelra.net/v3/bookings",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-630751493&cid=630751493.630751493&en=page_view",204,"text/plain"],["GET","https://api.pelra.net/v3/bookings/BKG-64899",200,"application/json"],["POST","https://api.pelra.net/v3/bookings",429,"application/json"],["POST","https://api.pelra.net/v3/bookings",201,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.pelra.net/sockjs-node/info",200,"application/json"],["GET","https://api.pelra.net/v3/bookings/BKG-50614",200,"application/json"],["PATCH","https://api.pelra.net/v3/bookings/BKG-50614",401,"application/json"],["POST","https://api.pelra.net/v3/sessions",429,"application/json"],["POST","https://api.pelra.net/v3/sessions",200,"application/json"],["PATCH","https://api.pelra.net/v3/bookings/BKG-50614",200,"application/json"],["DELETE","https://api.pelra.net/v3/bookings/BKG-88118",204,"x-unknown"],["GET","https://api.pelra.net/",200,"text/html"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.pelra.net/v3/sessions\",\n \"headers\": {\n \"host\": \"api.pelra.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.pelra.net\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pelra.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_96b78537\\\",\\\"csrf_token\\\":\\\"38b8628339acafdb\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[0.0,23.5,17.6,23.5,11.8,35.3,0.0],"c3b":[23.5,41.2,74.5,0.0,0.0,0.0,0.0]},"fails":{"c3a":[10,10,6,1,10,1,10],"c3b":[10,1,10,10,10,10,10]}},{"id":"v3_release3_23_cents+epoch+refresh_rotation_invoices","suite":"heal_v3","tier":"B","title":"Torrix Invoices API","goal":"# Torrix Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.torrix.io/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:invoices","base_path","noise","hidden_header","envelope","login_format:form","case:heal3","mutation:add_drift_cents","mutation:add_drift_epoch","mutation:add_refresh_rotation"],"n_requests":11,"requests":[["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.torrix.io/api/auth/token",200,"application/json"],["GET","https://api.torrix.io/api/items",200,"application/json"],["GET","https://api.torrix.io/api/items/INV-91099",200,"application/json"],["POST","https://api.torrix.io/api/items",201,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://o980663142.ingest.sentry.io/api/980663142/envelope/?sentry_key=50596d1b202bf9d475f8f24c",200,"application/json"],["PATCH","https://api.torrix.io/api/items/INV-77772",200,"application/json"],["DELETE","https://api.torrix.io/api/items/INV-66989",401,"application/json"],["POST","https://api.torrix.io/api/sessions/refresh",200,"application/json"],["DELETE","https://api.torrix.io/api/items/INV-66989",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.torrix.io/api/auth/token\",\n \"headers\": {\n \"host\": \"api.torrix.io\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-1.5\",\n \"origin\": \"https://app.torrix.io\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.torrix.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"access_token\\\":\\\"tok_d6f2cee8822480beecc88d09\\\",\\\"refresh\\\":\\\"rtk_ce927d2d737e18c8f7863177\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,35.3,58.8,17.6],"c3b":[100.0,100.0,100.0,100.0,17.6,17.6,17.6]},"fails":{"c3a":[6,6,6,6,3,11,6],"c3b":[-1,-1,-1,-1,6,6,6]}},{"id":"v3_release4_24_epoch+nest+async_create+moved_shipments","suite":"heal_v3","tier":"B","title":"Pello Shipments API","goal":"# Pello Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pello.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:link_header","domain:shipments","base_path","noise","hidden_header","envelope","case:heal3","mutation:add_drift_epoch","mutation:add_drift_nest","mutation:add_async_create","mutation:add_moved"],"n_requests":13,"requests":[["GET","https://api.pello.dev/static/media/logo.e1aecc66.svg",200,"image/svg+xml"],["GET","https://api.pello.dev/v2/items",200,"application/json"],["GET","https://api.pello.dev/v2/items?p=2",200,"application/json"],["GET","https://api.pello.dev/v2/entities/items/SHP-35759",200,"application/json"],["GET","https://api.pello.dev/",200,"text/html"],["POST","https://api.pello.dev/v2/items",202,"application/json"],["GET","https://api.pello.dev/config.json",200,"application/json"],["GET","https://api.pello.dev/v2/tasks/job_9b22167bfa3f",200,"application/json"],["GET","https://api.pello.dev/v2/tasks/job_9b22167bfa3f",200,"application/json"],["GET","https://api.pello.dev/v2/tasks/job_9b22167bfa3f",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["PATCH","https://api.pello.dev/v2/entities/items/SHP-41303",200,"application/json"],["DELETE","https://api.pello.dev/v2/entities/items/SHP-68880",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.pello.dev/v2/items\",\n \"headers\": {\n \"host\": \"api.pello.dev\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-06-11\",\n \"x-api-token\": \"sk_9037e2f4dec3dce988801f0f\",\n \"origin\": \"https://app.pello.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pello.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"SHP-57022\\\",\\\"created_at\\\":1767632520,\\\"carrier\\\":\\\"Tidewater Express\\\",\\\"status\\\":\\\"delivered\\\",\\\"origin\\\":\\\"Mumbai\\\",\\\"destination\\\":\\\"Osaka\\\",\\\"weight_kg\\\":302.4,\\\"fragile\\\":true,\\\"eta_days\\\":17,\\\"contact\\\":{\\\"name\\\":\\\"Marta Lindqvist\\\",\\\"email\\\":\\\"elin.berg@corp.test\\\"}},{\\\"id\\\":\\\"SHP-97963\\\",\\\"created_at\\\":1767633660,\\\"carrier\\\":\\\"Kestrel Lines\\\",\\\"status\\\":\\\"delivered\\\",\\\"origin\\\":\\\"Hanoi\\\",\\\"destination\\\":\\\"Lisbon\\\",\\\"weight_kg\\\":354.8,\\\"fragile\\\":true,\\\"eta_days\\\":13,\\\"contact\\\":{\\\"name\\\":\\\"Sofia Duarte\\\",\\\"email\\\":\\\"kofi.mensah@example.org\\\"}},{\\\"id\\\":\\\"SHP-92775\\\",\\\"created_at\\\":1767640320,\\\"carrier\\\":\\\"Northwind Freight\\\",\\\"status\\\":\\\"delivered\\\",\\\"origin\\\":\\\"Perth\\\",\\\"destination\\\":\\\"Nairobi\\\",\\\"weight_kg\\\":260.5,\\\"fragile\\\":true,","results":{"c3a":[17.6,0.0,31.4,0.0,0.0,0.0,58.8],"c3b":[100.0,100.0,72.5,17.6,17.6,82.4,17.6]},"fails":{"c3a":[2,0,6,2,3,2,11],"c3b":[-1,-1,6,6,6,2,6]}},{"id":"v3_release4_25_cents+rate_limit+refresh_rotation+idempotency_key_samples","suite":"heal_v3","tier":"B","title":"Velant Samples API","goal":"# Velant Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.velant.com/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:samples","base_path","noise","etag_update","hidden_header","envelope","login_format:form","case:heal3","mutation:add_drift_cents","mutation:add_rate_limit","mutation:add_refresh_rotation","mutation:add_idempotency_key"],"n_requests":14,"requests":[["GET","https://api.velant.com/static/media/logo.323b10df.svg",200,"image/svg+xml"],["POST","https://api.velant.com/v3/auth/login",200,"application/json"],["GET","https://api.velant.com/v3/items",200,"application/json"],["GET","https://api.velant.com/v3/items/SMP-49272",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-119386489",200,"application/javascript"],["POST","https://api.velant.com/v3/items",201,"application/json"],["GET","https://api.velant.com/v3/items/SMP-33180",401,"application/json"],["POST","https://api.velant.com/v3/sessions/refresh",429,"application/json"],["POST","https://api.velant.com/v3/sessions/refresh",200,"application/json"],["GET","https://api.velant.com/v3/items/SMP-33180",200,"application/json"],["PATCH","https://api.velant.com/v3/items/SMP-33180",200,"application/json"],["DELETE","https://api.velant.com/v3/items/SMP-38123",204,"x-unknown"],["GET","https://api.velant.com/config.json",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/8af920a42410ab305a581eb3.woff2",200,"font/woff2"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.velant.com/v3/auth/login\",\n \"headers\": {\n \"host\": \"api.velant.com\",\n \"connection\": \"keep-alive\",\n \"x-client-version\": \"2.14.1\",\n \"origin\": \"https://app.velant.com\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.velant.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"access_token\\\":\\\"tok_13cef880b0b43c1eea56c04d\\\",\\\"refresh_token\\\":\\\"rtk_9e26e9cb2d4038e02cf62aec\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,17.6,41.2,17.6],"c3b":[17.6,17.6,100.0,17.6,17.6,17.6,0.0]},"fails":{"c3a":[6,6,6,10,10,1,10],"c3b":[10,10,-1,10,10,10,10]}},{"id":"v3_release4_26_rename+cents+enum+async_create_tickets","suite":"heal_v3","tier":"B","title":"Lumant Tickets API","goal":"# Lumant Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.lumant.net/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:tickets","base_path","noise","etag_update","hidden_header","envelope","login_format:json","csrf_in:header","case:heal3","mutation:add_drift_rename","mutation:add_drift_cents","mutation:add_drift_enum","mutation:add_async_create"],"n_requests":14,"requests":[["POST","https://api.lumant.net/v2/login",200,"application/json"],["GET","https://api.lumant.net/v2/tickets",200,"application/json"],["GET","https://api.lumant.net/v2/tickets/TCK-62801",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.lumant.net/v2/tickets",202,"application/json"],["GET","https://api.lumant.net/v2/jobs/job_a9ca0dca8c2f",200,"application/json"],["GET","https://api.lumant.net/v2/jobs/job_a9ca0dca8c2f",200,"application/json"],["GET","https://api.lumant.net/v2/jobs/job_a9ca0dca8c2f",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.lumant.net/v2/tickets/TCK-96619",200,"application/json"],["PATCH","https://api.lumant.net/v2/tickets/TCK-96619",200,"application/json"],["GET","https://api.lumant.net/__flags",200,"application/json"],["DELETE","https://api.lumant.net/v2/tickets/TCK-82270",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.lumant.net/v2/login\",\n \"headers\": {\n \"host\": \"api.lumant.net\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-1.5\",\n \"origin\": \"https://app.lumant.net\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.lumant.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_d4c33c44\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,45.1,0.0,100.0,88.2,0.0],"c3b":[100.0,100.0,100.0,17.6,17.6,100.0,17.6]},"fails":{"c3a":[1,6,6,3,-1,9,4],"c3b":[-1,-1,-1,6,6,-1,6]}},{"id":"v3_release4_27_nest+enum+rate_limit+refresh_rotation_bookings","suite":"heal_v3","tier":"B","title":"Mirlo Bookings API","goal":"# Mirlo Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.mirlo.app/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:bookings","base_path","noise","etag_update","login_format:json","case:heal3","mutation:add_drift_nest","mutation:add_drift_enum","mutation:add_rate_limit","mutation:add_refresh_rotation"],"n_requests":14,"requests":[["POST","https://api.mirlo.app/v2/sessions",200,"application/json"],["GET","https://api.mirlo.app/__flags",200,"application/json"],["GET","https://api.mirlo.app/v2/bookings",200,"application/json"],["GET","https://api.mirlo.app/v2/bookings/BKG-43198",200,"application/json"],["POST","https://api.mirlo.app/v2/bookings",201,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.mirlo.app/static/media/logo.b6e3c6b1.svg",200,"image/svg+xml"],["GET","https://api.mirlo.app/v2/bookings/BKG-98358",401,"application/json"],["POST","https://api.mirlo.app/v2/auth/refresh",429,"application/json"],["POST","https://api.mirlo.app/v2/auth/refresh",200,"application/json"],["GET","https://api.mirlo.app/v2/bookings/BKG-98358",200,"application/json"],["PATCH","https://api.mirlo.app/v2/bookings/BKG-98358",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["DELETE","https://api.mirlo.app/v2/bookings/BKG-69151",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.mirlo.app/v2/sessions\",\n \"headers\": {\n \"host\": \"api.mirlo.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.mirlo.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.mirlo.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"jwt\\\":\\\"tok_c62a3056cd492c3b28a90764\\\",\\\"refresh_token\\\":\\\"rtk_1b1c403d431048cd8a1e06a6\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[0.0,58.8,72.5,17.6,0.0,100.0,0.0],"c3b":[100.0,17.6,72.5,0.0,17.6,100.0,5.9]},"fails":{"c3a":[10,1,1,10,10,-1,10],"c3b":[-1,10,10,2,10,-1,10]}},{"id":"v3_release4_28_epoch+async_create+idempotency_key+moved_invoices","suite":"heal_v3","tier":"B","title":"Havrix Invoices API","goal":"# Havrix Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havrix.dev/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:invoices","base_path","noise","case:heal3","mutation:add_drift_epoch","mutation:add_async_create","mutation:add_idempotency_key","mutation:add_moved"],"n_requests":11,"requests":[["GET","https://cdn.segment.com/analytics.js/v1/49c63c2e1bab68e27ec1c552/analytics.min.js",200,"application/javascript"],["GET","https://api.havrix.dev/v3/items",200,"application/json"],["GET","https://api.havrix.dev/v3/items?start=10",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-115286322.js?sv=6",200,"application/javascript"],["GET","https://api.havrix.dev/v3/rest/items/INV-71283",200,"application/json"],["POST","https://api.havrix.dev/v3/items",202,"application/json"],["GET","https://api.havrix.dev/v3/tasks/job_9d2da3e5ecdb",200,"application/json"],["POST","https://o678147586.ingest.sentry.io/api/678147586/envelope/?sentry_key=3b903e8ea8e7f3f8180878f8",200,"application/json"],["GET","https://api.havrix.dev/v3/tasks/job_9d2da3e5ecdb",200,"application/json"],["PATCH","https://api.havrix.dev/v3/rest/items/INV-42761",200,"application/json"],["DELETE","https://api.havrix.dev/v3/rest/items/INV-17093",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.havrix.dev/v3/items\",\n \"headers\": {\n \"host\": \"api.havrix.dev\",\n \"connection\": \"keep-alive\",\n \"x-api-token\": \"sk_696fad69bfd57ea599b4058c\",\n \"origin\": \"https://app.havrix.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havrix.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"results\\\":[{\\\"id\\\":\\\"INV-31405\\\",\\\"created_at\\\":1767609240,\\\"customer\\\":\\\"Mosaic Freight\\\",\\\"state\\\":\\\"void\\\",\\\"amount_cents\\\":160481,\\\"currency\\\":\\\"EUR\\\",\\\"due_date\\\":\\\"2026-07-01\\\",\\\"memo\\\":\\\"Export fails for archived projects\\\"},{\\\"id\\\":\\\"INV-42636\\\",\\\"created_at\\\":1767612180,\\\"customer\\\":\\\"Mosaic Freight\\\",\\\"state\\\":\\\"void\\\",\\\"amount_cents\\\":98908,\\\"currency\\\":\\\"GBP\\\",\\\"due_date\\\":\\\"2026-08-15\\\",\\\"memo\\\":\\\"Webhook retries stop after day two\\\"},{\\\"id\\\":\\\"INV-81777\\\",\\\"created_at\\\":1767616140,\\\"customer\\\":\\\"Nimbus Dental\\\",\\\"state\\\":\\\"sent\\\",\\\"amount_cents\\\":907955,\\\"currency\\\":\\\"EUR\\\",\\\"due_date\\\":\\\"2026-05-06\\\",\\\"memo\\\":\\\"Export fails for archived projects\\\"},{\\\"id\\\":\\\"INV-31972\\\",\\\"created_at\\\":1767622740,\\\"customer\\\":\\\"Ostrava Tools\\\",\\\"state\\\":\\\"paid\\\",\\\"amount_cents\\\":842364,\\\"curr\"\n ","results":{"c3a":[0.0,17.6,17.6,100.0,100.0,100.0,0.0],"c3b":[41.2,41.2,100.0,82.4,100.0,41.2,17.6]},"fails":{"c3a":[1,6,6,-1,-1,-1,1],"c3b":[1,1,-1,1,-1,1,6]}},{"id":"v3_release4_29_rename+epoch+enum+moved_shipments","suite":"heal_v3","tier":"B","title":"Havlo Shipments API","goal":"# Havlo Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havlo.dev/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:shipments","base_path","noise","hidden_header","envelope","login_format:form","csrf_in:json","case:heal3","mutation:add_drift_rename","mutation:add_drift_epoch","mutation:add_drift_enum","mutation:add_moved"],"n_requests":10,"requests":[["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://api.havlo.dev/v1/login",200,"application/json"],["GET","https://api.havlo.dev/v1/records",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-184044420",200,"application/javascript"],["GET","https://api.havlo.dev/v1/records?skip=10",200,"application/json"],["GET","https://api.havlo.dev/v1/entities/records/SHP-50102",200,"application/json"],["POST","https://api.havlo.dev/v1/records",201,"application/json"],["PATCH","https://api.havlo.dev/v1/entities/records/SHP-44443",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-483710280&cid=483710280.483710280&en=page_view",204,"text/plain"],["DELETE","https://api.havlo.dev/v1/entities/records/SHP-31138",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.havlo.dev/v1/login\",\n \"headers\": {\n \"host\": \"api.havlo.dev\",\n \"connection\": \"keep-alive\",\n \"x-client-version\": \"2.16.8\",\n \"origin\": \"https://app.havlo.dev\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havlo.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_6ca26d43\\\",\\\"csrf_token\\\":\\\"56805aad8725c94d\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,58.8,58.8,0.0],"c3b":[100.0,100.0,100.0,17.6,17.6,17.6,17.6]},"fails":{"c3a":[1,1,1,1,1,1,1],"c3b":[-1,-1,-1,1,6,1,6]}},{"id":"v3_release4_30_rename+cents+rate_limit+idempotency_key_bookings","suite":"heal_v3","tier":"B","title":"Torra Bookings API","goal":"# Torra Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.torra.app/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:bookings","base_path","noise","etag_update","case:heal3","mutation:add_drift_rename","mutation:add_drift_cents","mutation:add_rate_limit","mutation:add_idempotency_key"],"n_requests":11,"requests":[["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.torra.app/api/items",200,"application/json"],["GET","https://api.torra.app/api/items?page_token=NDM4YmU5MWE6MTA",200,"application/json"],["GET","https://api.torra.app/api/items/BKG-82698",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.torra.app/api/items",201,"application/json"],["GET","https://api.torra.app/api/items/BKG-35893",200,"application/json"],["PATCH","https://api.torra.app/api/items/BKG-35893",429,"application/json"],["PATCH","https://api.torra.app/api/items/BKG-35893",200,"application/json"],["DELETE","https://api.torra.app/api/items/BKG-24795",204,"x-unknown"],["GET","https://api.torra.app/static/js/main.9748fdc8.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.torra.app/api/items\",\n \"headers\": {\n \"host\": \"api.torra.app\",\n \"connection\": \"keep-alive\",\n \"api-key\": \"sk_d52a78e7afff2f59a77bb8da\",\n \"origin\": \"https://app.torra.app\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.torra.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"records\\\":[{\\\"id\\\":\\\"BKG-87156\\\",\\\"created_at\\\":\\\"2026-01-05T13:23:00Z\\\",\\\"guest_name\\\":\\\"Marta Lindqvist\\\",\\\"room\\\":\\\"Ember\\\",\\\"starts_on\\\":\\\"2026-10-08\\\",\\\"nights\\\":12,\\\"party_size\\\":4,\\\"confirmed\\\":false,\\\"price_cents\\\":28106},{\\\"id\\\":\\\"BKG-38042\\\",\\\"created_at\\\":\\\"2026-01-05T14:13:00Z\\\",\\\"guest_name\\\":\\\"Amara Okoye\\\",\\\"room\\\":\\\"Aurora\\\",\\\"starts_on\\\":\\\"2026-08-21\\\",\\\"nights\\\":10,\\\"party_size\\\":1,\\\"confirmed\\\":false,\\\"price_cents\\\":45803},{\\\"id\\\":\\\"BKG-91295\\\",\\\"created_at\\\":\\\"2026-01-05T14:40:00Z\\\",\\\"guest_name\\\":\\\"Tomas Ito\\\",\\\"room\\\":\\\"Ember\\\",\\\"starts_on\\\":\\\"2026-01-04\\\",\\\"nights\\\":1,\\\"party_size\\\":1,\\\"confirmed\\\":false,\\\"price_cents\\\":35922},{\\\"id\\\":\\\"BKG-35893\\\",\\\"created_at\\\":\\\"2026-01-05T15:55:00Z\\\",\\\"guest_name\\\":\\\"Tomas Ito\\\",\\\"room\\\":\\\"Ember\\\",\\\"starts_on\\\":\\\"2026-05-04\\\",\\\"night\"\n ","results":{"c3a":[17.6,17.6,31.4,5.9,17.6,5.9,0.0],"c3b":[41.2,100.0,72.5,5.9,41.2,0.0,5.9]},"fails":{"c3a":[6,6,6,10,6,10,10],"c3b":[1,-1,6,10,1,10,10]}},{"id":"v3_release4_31_nest+rate_limit+refresh_rotation+idempotency_key_tickets","suite":"heal_v3","tier":"B","title":"Solvo Tickets API","goal":"# Solvo Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.solvo.dev/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:tickets","base_path","noise","hidden_header","login_format:form","case:heal3","mutation:add_drift_nest","mutation:add_rate_limit","mutation:add_refresh_rotation","mutation:add_idempotency_key"],"n_requests":13,"requests":[["POST","https://api.solvo.dev/v1/login",200,"application/json"],["GET","https://api.solvo.dev/__flags",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.solvo.dev/v1/items",200,"application/json"],["GET","https://api.solvo.dev/v1/items/TCK-56720",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.solvo.dev/manifest.json",200,"application/json"],["POST","https://api.solvo.dev/v1/items",201,"application/json"],["PATCH","https://api.solvo.dev/v1/items/TCK-53747",429,"application/json"],["PATCH","https://api.solvo.dev/v1/items/TCK-53747",200,"application/json"],["DELETE","https://api.solvo.dev/v1/items/TCK-50488",401,"application/json"],["POST","https://api.solvo.dev/v1/token/refresh",200,"application/json"],["DELETE","https://api.solvo.dev/v1/items/TCK-50488",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.solvo.dev/v1/login\",\n \"headers\": {\n \"host\": \"api.solvo.dev\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-5.3\",\n \"origin\": \"https://app.solvo.dev\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.solvo.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"jwt\\\":\\\"tok_b0f599dec3a51a20fbc78786\\\",\\\"refresh_token\\\":\\\"rtk_57b4f9df24b96089b2763da5\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[17.6,11.8,29.4,41.2,0.0,58.8,17.6],"c3b":[76.5,17.6,47.1,17.6,17.6,17.6,17.6]},"fails":{"c3a":[6,6,10,1,10,11,10],"c3b":[4,10,10,10,10,10,10]}},{"id":"v3_sdk_40_epoch+rate_limit+async_create_shipments","suite":"heal_v3","tier":"B","title":"Mirra Shipments API","goal":"# Mirra Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.mirra.net/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:link_header","domain:shipments","base_path","noise","etag_update","envelope","case:heal3","mutation:add_drift_epoch","mutation:add_rate_limit","mutation:add_async_create"],"n_requests":17,"requests":[["GET","https://api.mirra.net/sockjs-node/info",200,"application/json"],["POST","https://o60055426.ingest.sentry.io/api/60055426/envelope/?sentry_key=edc6e789996544bc8c6b0f2a",200,"application/json"],["GET","https://api.mirra.net/v1/records",200,"application/json"],["GET","https://api.mirra.net/v1/records?page=2",200,"application/json"],["GET","https://api.mirra.net/v1/records/SHP-58928",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.mirra.net/v1/records",202,"application/json"],["GET","https://api.mirra.net/v1/jobs/job_ec6422db4291",429,"application/json"],["GET","https://api.mirra.net/v1/jobs/job_ec6422db4291",200,"application/json"],["GET","https://api.mirra.net/v1/jobs/job_ec6422db4291",200,"application/json"],["GET","https://api.mirra.net/v1/jobs/job_ec6422db4291",200,"application/json"],["GET","https://api.mirra.net/v1/records/SHP-52986",200,"application/json"],["PATCH","https://api.mirra.net/v1/records/SHP-52986",429,"application/json"],["PATCH","https://api.mirra.net/v1/records/SHP-52986",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["DELETE","https://api.mirra.net/v1/records/SHP-55575",204,"x-unknown"],["GET","https://api.mirra.net/static/css/main.98eaa5b6.css",200,"text/css"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.mirra.net/sockjs-node/info\",\n \"headers\": {\n \"host\": \"api.mirra.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.mirra.net\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.mirra.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"websocket\\\":true,\\\"origins\\\":[\\\"*:*\\\"],\\\"cookie_needed\\\":false,\\\"entropy\\\":719922056}\"\n }\n }\n}","results":{"c3a":[0.0,100.0,66.7,0.0,0.0,100.0,100.0],"c3b":[100.0,100.0,100.0,0.0,0.0,0.0,0.0]},"fails":{"c3a":[3,-1,3,10,10,-1,-1],"c3b":[-1,-1,-1,10,3,10,10]}},{"id":"v3_sdk_41_rename+cents+rate_limit_tickets","suite":"heal_v3","tier":"B","title":"Solora Tickets API","goal":"# Solora Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.solora.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:tickets","base_path","noise","etag_update","case:heal3","mutation:add_drift_rename","mutation:add_drift_cents","mutation:add_rate_limit"],"n_requests":11,"requests":[["GET","https://api.solora.dev/v2/tickets",200,"application/json"],["GET","https://api.solora.dev/v2/tickets?offset=10",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/006afadfd5de981b93c7f32d.woff2",200,"font/woff2"],["GET","https://api.solora.dev/v2/tickets/TCK-62176",200,"application/json"],["POST","https://api.solora.dev/v2/tickets",201,"application/json"],["GET","https://api.solora.dev/v2/tickets/TCK-18915",200,"application/json"],["PATCH","https://api.solora.dev/v2/tickets/TCK-18915",429,"application/json"],["PATCH","https://api.solora.dev/v2/tickets/TCK-18915",200,"application/json"],["GET","https://api.solora.dev/robots.txt",200,"text/plain"],["DELETE","https://api.solora.dev/v2/tickets/TCK-11492",204,"x-unknown"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.solora.dev/v2/tickets\",\n \"headers\": {\n \"host\": \"api.solora.dev\",\n \"connection\": \"keep-alive\",\n \"x-api-key\": \"sk_c12c6926455e8f23533b2c81\",\n \"origin\": \"https://app.solora.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.solora.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"results\\\":[{\\\"id\\\":\\\"TCK-50060\\\",\\\"created_at\\\":\\\"2026-01-05T18:05:00Z\\\",\\\"title\\\":\\\"Mobile app logs users out\\\",\\\"priority\\\":\\\"normal\\\",\\\"assignee\\\":\\\"Marta Lindqvist\\\",\\\"team\\\":\\\"security\\\",\\\"estimate_hours\\\":16,\\\"customer_visible\\\":false,\\\"fee_cents\\\":73953},{\\\"id\\\":\\\"TCK-52616\\\",\\\"created_at\\\":\\\"2026-01-05T18:31:00Z\\\",\\\"title\\\":\\\"Dashboard shows stale totals\\\",\\\"priority\\\":\\\"low\\\",\\\"assignee\\\":\\\"Amara Okoye\\\",\\\"team\\\":\\\"platform\\\",\\\"estimate_hours\\\":14,\\\"customer_visible\\\":true,\\\"fee_cents\\\":34182},{\\\"id\\\":\\\"TCK-74132\\\",\\\"created_at\\\":\\\"2026-01-05T19:30:00Z\\\",\\\"title\\\":\\\"Dashboard shows stale totals\\\",\\\"priority\\\":\\\"urgent\\\",\\\"assignee\\\":\\\"Dev Patel\\\",\\\"team\\\":\\\"platform\\\",\\\"estimate_hours\\\":30,\\\"customer_visible\\\":true,\\\"fee_cents\\\":54823},{\\\"id\\\":\\\"TCK-18915\\\",\\\"created_at\\\":\\\"20\"\n }","results":{"c3a":[100.0,100.0,100.0,100.0,0.0,5.9,0.0],"c3b":[100.0,100.0,66.7,5.9,5.9,5.9,5.9]},"fails":{"c3a":[-1,-1,-1,-1,10,10,10],"c3b":[-1,-1,3,10,3,10,10]}},{"id":"v3_sdk_42_cents+async_create+moved_samples","suite":"heal_v3","tier":"B","title":"Torly Samples API","goal":"# Torly Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.torly.net/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:samples","base_path","noise","hidden_header","envelope","login_format:json","csrf_in:header","case:heal3","mutation:add_drift_cents","mutation:add_async_create","mutation:add_moved"],"n_requests":14,"requests":[["GET","https://api.torly.net/config.json",200,"application/json"],["POST","https://api.torly.net/v1/sessions",200,"application/json"],["GET","https://api.torly.net/v1/samples",200,"application/json"],["GET","https://api.torly.net/v1/samples?skip=10",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/d6262533ee2491114e807a5b.woff2",200,"font/woff2"],["GET","https://api.torly.net/v1/data/samples/SMP-45986",200,"application/json"],["POST","https://api.torly.net/v1/samples",202,"application/json"],["GET","https://api.torly.net/v1/tasks/job_5baf761be6ec",200,"application/json"],["GET","https://api.torly.net/v1/tasks/job_5baf761be6ec",200,"application/json"],["GET","https://api.torly.net/v1/tasks/job_5baf761be6ec",200,"application/json"],["PATCH","https://api.torly.net/v1/data/samples/SMP-12009",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-862386348",200,"application/javascript"],["DELETE","https://api.torly.net/v1/data/samples/SMP-87894",204,"x-unknown"],["GET","https://fonts.gstatic.com/s/inter/v13/e1c462706bdda65d3f63b5f9.woff2",200,"font/woff2"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.torly.net/config.json\",\n \"headers\": {\n \"host\": \"api.torly.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.torly.net\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.torly.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"672c5085\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,82.4,82.4,100.0,17.6],"c3b":[64.7,100.0,100.0,100.0,17.6,100.0,94.1]},"fails":{"c3a":[-1,-1,-1,2,2,-1,6],"c3b":[2,-1,-1,-1,3,-1,11]}},{"id":"v3_sdk_43_epoch+nest+refresh_rotation_bookings","suite":"heal_v3","tier":"B","title":"Torton Bookings API","goal":"# Torton Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.torton.app/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:bookings","base_path","noise","etag_update","envelope","login_format:form","case:heal3","mutation:add_drift_epoch","mutation:add_drift_nest","mutation:add_refresh_rotation"],"n_requests":17,"requests":[["GET","https://api.torton.app/ping",200,"application/json"],["POST","https://api.torton.app/v2/auth/login",200,"application/json"],["GET","https://api.torton.app/v2/bookings",200,"application/json"],["GET","https://api.torton.app/v2/bookings?cursor=ZDY3NzViZjM6MTA",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-40243687",200,"application/javascript"],["GET","https://api.torton.app/v2/bookings/BKG-96499",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.torton.app/v2/bookings",401,"application/json"],["POST","https://api.torton.app/v2/token/refresh",200,"application/json"],["POST","https://api.torton.app/v2/bookings",201,"application/json"],["GET","https://api.torton.app/static/css/main.e2522cc6.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.torton.app/v2/bookings/BKG-69365",200,"application/json"],["PATCH","https://api.torton.app/v2/bookings/BKG-69365",200,"application/json"],["DELETE","https://api.torton.app/v2/bookings/BKG-31420",401,"application/json"],["POST","https://api.torton.app/v2/token/refresh",200,"application/json"],["DELETE","https://api.torton.app/v2/bookings/BKG-31420",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.torton.app/ping\",\n \"headers\": {\n \"host\": \"api.torton.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.torton.app\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.torton.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"status\\\":\\\"ok\\\",\\\"t\\\":443680134}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,17.6,17.6,17.6],"c3b":[17.6,0.0,11.8,0.0,17.6,0.0,100.0]},"fails":{"c3a":[6,6,6,6,6,6,6],"c3b":[6,10,6,3,6,3,-1]}},{"id":"v3_sdk_44_rename+refresh_rotation+moved_invoices","suite":"heal_v3","tier":"B","title":"Sollo Invoices API","goal":"# Sollo Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.sollo.app/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:invoices","base_path","noise","login_format:form","case:heal3","mutation:add_drift_rename","mutation:add_refresh_rotation","mutation:add_moved"],"n_requests":13,"requests":[["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.sollo.app/v1/auth/token",200,"application/json"],["GET","https://api.sollo.app/v1/items",200,"application/json"],["GET","https://api.sollo.app/v1/items?cursor=YzE2OTUxMmI6MTA",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.sollo.app/sockjs-node/info",200,"application/json"],["GET","https://api.sollo.app/v1/entities/items/INV-48125",200,"application/json"],["POST","https://api.sollo.app/v1/items",401,"application/json"],["POST","https://api.sollo.app/v1/auth/refresh",200,"application/json"],["POST","https://api.sollo.app/v1/items",201,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-578741424&cid=578741424.578741424&en=page_view",204,"text/plain"],["PATCH","https://api.sollo.app/v1/entities/items/INV-53185",200,"application/json"],["DELETE","https://api.sollo.app/v1/entities/items/INV-82728",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.sollo.app/v1/auth/token\",\n \"headers\": {\n \"host\": \"api.sollo.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.sollo.app\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.sollo.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"jwt\\\":\\\"tok_a4c6eae1cf04a1ad7b83b160\\\",\\\"refresh_token\\\":\\\"rtk_ff69c4b52192c86cf5e258c9\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,72.5,0.0,17.6,17.6,17.6],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,3,6,6,6]}},{"id":"v3_sdk_45_rename+enum+idempotency_key_bookings","suite":"heal_v3","tier":"B","title":"Kesik Bookings API","goal":"# Kesik Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.kesik.io/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:bookings","base_path","noise","etag_update","login_format:form","csrf_in:header","case:heal3","mutation:add_drift_rename","mutation:add_drift_enum","mutation:add_idempotency_key"],"n_requests":11,"requests":[["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.kesik.io/favicon.ico",200,"image/x-icon"],["POST","https://api.kesik.io/v3/auth/login",200,"application/json"],["GET","https://api.kesik.io/v3/items",200,"application/json"],["GET","https://api.kesik.io/v3/items?cursor=NWQ5NjNkOTk6MTA",200,"application/json"],["GET","https://api.kesik.io/v3/items/BKG-28896",200,"application/json"],["POST","https://api.kesik.io/v3/items",201,"application/json"],["GET","https://api.kesik.io/v3/items/BKG-65671",200,"application/json"],["PATCH","https://api.kesik.io/v3/items/BKG-65671",200,"application/json"],["DELETE","https://api.kesik.io/v3/items/BKG-40520",204,"x-unknown"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.kesik.io/v3/auth/login\",\n \"headers\": {\n \"host\": \"api.kesik.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.kesik.io\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.kesik.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_45337855\\\"}\"\n }\n }\n}","results":{"c3a":[100.0,41.2,100.0,82.4,0.0,100.0,0.0],"c3b":[41.2,41.2,100.0,82.4,82.4,41.2,100.0]},"fails":{"c3a":[-1,1,-1,1,1,-1,3],"c3b":[1,1,-1,1,1,1,-1]}},{"id":"v3_sdk_46_epoch+rate_limit+async_create_invoices","suite":"heal_v3","tier":"B","title":"Kesvo Invoices API","goal":"# Kesvo Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.kesvo.co/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:link_header","domain:invoices","base_path","noise","envelope","case:heal3","mutation:add_drift_epoch","mutation:add_rate_limit","mutation:add_async_create"],"n_requests":13,"requests":[["GET","https://api.kesvo.co/config.json",200,"application/json"],["GET","https://api.kesvo.co/v3/invoices",200,"application/json"],["GET","https://api.kesvo.co/robots.txt",200,"text/plain"],["GET","https://api.kesvo.co/v3/invoices?p=2",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.kesvo.co/v3/invoices/INV-84745",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.kesvo.co/v3/invoices",202,"application/json"],["GET","https://api.kesvo.co/v3/tasks/job_ad1bb50ef644",200,"application/json"],["GET","https://api.kesvo.co/v3/tasks/job_ad1bb50ef644",429,"application/json"],["GET","https://api.kesvo.co/v3/tasks/job_ad1bb50ef644",200,"application/json"],["PATCH","https://api.kesvo.co/v3/invoices/INV-36474",200,"application/json"],["DELETE","https://api.kesvo.co/v3/invoices/INV-82382",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.kesvo.co/config.json\",\n \"headers\": {\n \"host\": \"api.kesvo.co\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.kesvo.co\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.kesvo.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"1a7cd148\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}","results":{"c3a":[5.9,5.9,94.1,5.9,0.0,82.4,5.9],"c3b":[100.0,5.9,100.0,5.9,0.0,100.0,5.9]},"fails":{"c3a":[10,10,2,10,10,2,10],"c3b":[-1,10,-1,10,3,-1,10]}},{"id":"v3_sdk_47_cents+nest+async_create_tickets","suite":"heal_v3","tier":"B","title":"Veldex Tickets API","goal":"# Veldex Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.veldex.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:tickets","base_path","noise","hidden_header","envelope","case:heal3","mutation:add_drift_cents","mutation:add_drift_nest","mutation:add_async_create"],"n_requests":11,"requests":[["GET","https://api.veldex.dev/v2/tickets",200,"application/json"],["GET","https://api.veldex.dev/v2/tickets?skip=10",200,"application/json"],["GET","https://api.veldex.dev/v2/tickets/TCK-83675",200,"application/json"],["POST","https://api.veldex.dev/v2/tickets",202,"application/json"],["GET","https://api.veldex.dev/v2/jobs/job_0336520385c1",200,"application/json"],["GET","https://api.veldex.dev/v2/jobs/job_0336520385c1",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-784005689",200,"application/javascript"],["GET","https://fonts.gstatic.com/s/inter/v13/b35227b8d1f2be5885f82fe7.woff2",200,"font/woff2"],["GET","https://px.ads.linkedin.com/collect?pid=43077487&fmt=gif",204,"image/gif"],["PATCH","https://api.veldex.dev/v2/tickets/TCK-63362",200,"application/json"],["DELETE","https://api.veldex.dev/v2/tickets/TCK-65204",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.veldex.dev/v2/tickets\",\n \"headers\": {\n \"host\": \"api.veldex.dev\",\n \"connection\": \"keep-alive\",\n \"x-app-build\": \"8638\",\n \"api-key\": \"sk_87db0cb0ff4a91cf2822b981\",\n \"origin\": \"https://app.veldex.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.veldex.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"TCK-41526\\\",\\\"created_at\\\":\\\"2026-01-05T17:51:00Z\\\",\\\"title\\\":\\\"Bulk import times out\\\",\\\"priority\\\":\\\"urgent\\\",\\\"assignee\\\":\\\"Elin Berg\\\",\\\"queue\\\":\\\"billing\\\",\\\"estimate_hours\\\":22,\\\"customer_visible\\\":false,\\\"fee_cents\\\":7107,\\\"customer\\\":{\\\"name\\\":\\\"Elin Berg\\\",\\\"email\\\":\\\"lena.brandt@mail.test\\\"}},{\\\"id\\\":\\\"TCK-53320\\\",\\\"created_at\\\":\\\"2026-01-05T18:44:00Z\\\",\\\"title\\\":\\\"Role change not applied\\\",\\\"priority\\\":\\\"normal\\\",\\\"assignee\\\":\\\"Amara Okoye\\\",\\\"queue\\\":\\\"billing\\\",\\\"estimate_hours\\\":9,\\\"customer_visible\\\":true,\\\"fee_cents\\\":33980,\\\"customer\\\":{\\\"name\\\":\\\"Ines Varga\\\",\\\"email\\\":\\\"marta.lindqvist@mail.test\\\"}},{\\\"id\\\":\\\"TCK-16776\\\",\\\"created_at\\\":\\\"2026-01-05T20:44:00Z\\\",\\\"title\\\":\\\"Cannot reset two-factor device\\\",\\\"priority\\\":\\\"urgent\\\",\\","results":{"c3a":[100.0,100.0,100.0,17.6,82.4,100.0,58.8],"c3b":[100.0,100.0,100.0,100.0,35.3,82.4,82.4]},"fails":{"c3a":[-1,-1,-1,6,2,-1,11],"c3b":[-1,-1,-1,-1,3,2,3]}},{"id":"v3_single_00_cents_tickets","suite":"heal_v3","tier":"B","title":"Quoora Tickets API","goal":"# Quoora Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quoora.io/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:tickets","base_path","noise","etag_update","hidden_header","envelope","login_format:form","case:heal3","mutation:add_drift_cents"],"n_requests":11,"requests":[["POST","https://api.quoora.io/v2/sessions",200,"application/json"],["GET","https://api.quoora.io/v2/tickets",200,"application/json"],["GET","https://api.quoora.io/v2/tickets?p=2",200,"application/json"],["GET","https://api.quoora.io/v2/tickets/TCK-53321",200,"application/json"],["POST","https://api.quoora.io/v2/tickets",201,"application/json"],["GET","https://api.quoora.io/v2/tickets/TCK-48522",200,"application/json"],["PATCH","https://api.quoora.io/v2/tickets/TCK-48522",200,"application/json"],["DELETE","https://api.quoora.io/v2/tickets/TCK-36180",204,"x-unknown"],["GET","https://api.quoora.io/static/css/main.9a5fce5b.css",200,"text/css"],["GET","https://cdn.segment.com/analytics.js/v1/578d75d4d4683dc223f073dc/analytics.min.js",200,"application/javascript"],["GET","https://api.quoora.io/static/js/main.4b0bed3f.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.quoora.io/v2/sessions\",\n \"headers\": {\n \"host\": \"api.quoora.io\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-2.4\",\n \"origin\": \"https://app.quoora.io\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.quoora.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"token\\\":\\\"tok_20e5d7d2f0bb08fec7046e33\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,45.1,0.0,0.0,58.8,17.6],"c3b":[100.0,100.0,100.0,0.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,0,0,11,6],"c3b":[-1,-1,-1,0,-1,-1,-1]}},{"id":"v3_single_01_cents_samples","suite":"heal_v3","tier":"B","title":"Pelora Samples API","goal":"# Pelora Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pelora.net/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:samples","base_path","noise","etag_update","hidden_header","envelope","case:heal3","mutation:add_drift_cents"],"n_requests":10,"requests":[["GET","https://api.pelora.net/static/js/main.674ff530.js",200,"application/javascript"],["GET","https://api.pelora.net/v3/records",200,"application/json"],["GET","https://api.pelora.net/v3/records?offset=10",200,"application/json"],["GET","https://api.pelora.net/v3/records/SMP-38760",200,"application/json"],["POST","https://api.pelora.net/v3/records",201,"application/json"],["GET","https://api.pelora.net/v3/records/SMP-39629",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["PATCH","https://api.pelora.net/v3/records/SMP-39629",200,"application/json"],["DELETE","https://api.pelora.net/v3/records/SMP-29050",204,"x-unknown"],["GET","https://px.ads.linkedin.com/collect?pid=289326044&fmt=gif",204,"image/gif"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.pelora.net/v3/records\",\n \"headers\": {\n \"host\": \"api.pelora.net\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-5.8\",\n \"x-auth-key\": \"sk_7f86f955f54ba319c9a6c8a8\",\n \"origin\": \"https://app.pelora.net\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pelora.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"SMP-39629\\\",\\\"created_at\\\":\\\"2026-01-05T10:15:00Z\\\",\\\"assay\\\":\\\"elisa\\\",\\\"lab\\\":\\\"north\\\",\\\"volume_ul\\\":640.7,\\\"collected_on\\\":\\\"2026-10-05\\\",\\\"batch\\\":\\\"B-3207\\\",\\\"hazardous\\\":false,\\\"amount_cents\\\":8930},{\\\"id\\\":\\\"SMP-11806\\\",\\\"created_at\\\":\\\"2026-01-05T11:32:00Z\\\",\\\"assay\\\":\\\"elisa\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":46.3,\\\"collected_on\\\":\\\"2026-07-28\\\",\\\"batch\\\":\\\"B-5947\\\",\\\"hazardous\\\":true,\\\"amount_cents\\\":5846},{\\\"id\\\":\\\"SMP-28500\\\",\\\"created_at\\\":\\\"2026-01-05T11:39:00Z\\\",\\\"assay\\\":\\\"pcr\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":707.6,\\\"collected_on\\\":\\\"2026-01-17\\\",\\\"batch\\\":\\\"B-1920\\\",\\\"hazardous\\\":true,\\\"amount_cents\\\":21096},{\\\"id\\\":\\\"SMP-77557\\\",\\\"created_at\\\":\\\"2026-01-05T11:50:00Z\\\",\\\"assay\\\":\\\"elisa\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":413.4","results":{"c3a":[17.6,17.6,17.6,100.0,100.0,58.8,17.6],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,-1,-1,11,6]}},{"id":"v3_single_02_epoch_shipments","suite":"heal_v3","tier":"B","title":"Fenlo Shipments API","goal":"# Fenlo Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.fenlo.dev/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:shipments","base_path","noise","token_expiry","hidden_header","envelope","login_format:json","csrf_in:json","case:heal3","mutation:add_drift_epoch"],"n_requests":11,"requests":[["POST","https://o428287931.ingest.sentry.io/api/428287931/envelope/?sentry_key=85712a283cd85d2d6aada3c1",200,"application/json"],["POST","https://api.fenlo.dev/v1/login",200,"application/json"],["GET","https://api.fenlo.dev/v1/records",200,"application/json"],["GET","https://api.fenlo.dev/v1/records/SHP-98526",200,"application/json"],["POST","https://api.fenlo.dev/v1/records",201,"application/json"],["PATCH","https://api.fenlo.dev/v1/records/SHP-64247",200,"application/json"],["DELETE","https://api.fenlo.dev/v1/records/SHP-69826",401,"application/json"],["POST","https://api.fenlo.dev/v1/login",200,"application/json"],["DELETE","https://api.fenlo.dev/v1/records/SHP-69826",204,"x-unknown"],["GET","https://api.fenlo.dev/favicon.ico",200,"image/x-icon"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o428287931.ingest.sentry.io/api/428287931/envelope/?sentry_key=85712a283cd85d2d6aada3c1\",\n \"headers\": {\n \"host\": \"o428287931.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.fenlo.dev\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.fenlo.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"94e53e662dc1fbb3c9e55e60\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,45.1,17.6,100.0,100.0,0.0],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,17.6]},"fails":{"c3a":[6,6,6,6,-1,-1,1],"c3b":[-1,-1,-1,-1,-1,-1,6]}},{"id":"v3_single_03_epoch_bookings","suite":"heal_v3","tier":"B","title":"Nimrix Bookings API","goal":"# Nimrix Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.nimrix.co/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:bookings","base_path","noise","etag_update","hidden_header","envelope","login_format:json","case:heal3","mutation:add_drift_epoch"],"n_requests":11,"requests":[["GET","https://api.nimrix.co/robots.txt",200,"text/plain"],["POST","https://api.nimrix.co/v3/auth/login",200,"application/json"],["GET","https://api.nimrix.co/v3/bookings",200,"application/json"],["GET","https://api.nimrix.co/v3/bookings?cursor=ZWZhZWM1ZmY6MTA",200,"application/json"],["GET","https://api.nimrix.co/v3/bookings/BKG-12851",200,"application/json"],["POST","https://api.nimrix.co/v3/bookings",201,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.nimrix.co/v3/bookings/BKG-29189",200,"application/json"],["PATCH","https://api.nimrix.co/v3/bookings/BKG-29189",200,"application/json"],["DELETE","https://api.nimrix.co/v3/bookings/BKG-85437",204,"x-unknown"],["GET","https://api.nimrix.co/manifest.json",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.nimrix.co/v3/auth/login\",\n \"headers\": {\n \"host\": \"api.nimrix.co\",\n \"connection\": \"keep-alive\",\n \"x-client-version\": \"6.11.3\",\n \"origin\": \"https://app.nimrix.co\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.nimrix.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"access_token\\\":\\\"tok_d02d03752584e695f815a959\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,100.0,100.0,100.0,100.0,100.0,17.6],"c3b":[100.0,100.0,100.0,17.6,100.0,17.6,100.0]},"fails":{"c3a":[6,-1,-1,-1,-1,-1,6],"c3b":[-1,-1,-1,6,-1,6,-1]}},{"id":"v3_single_04_nest_invoices","suite":"heal_v3","tier":"B","title":"Torra Invoices API","goal":"# Torra Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.torra.com/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:none","domain:invoices","base_path","noise","etag_update","hidden_header","case:heal3","mutation:add_drift_nest"],"n_requests":9,"requests":[["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-738161063&cid=738161063.738161063&en=page_view",204,"text/plain"],["GET","https://api.torra.com/v1/items",200,"application/json"],["GET","https://api.torra.com/v1/items/INV-55231",200,"application/json"],["POST","https://api.torra.com/v1/items",201,"application/json"],["GET","https://api.torra.com/v1/items/INV-97615",200,"application/json"],["PATCH","https://api.torra.com/v1/items/INV-97615",200,"application/json"],["DELETE","https://api.torra.com/v1/items/INV-27580",204,"x-unknown"],["GET","https://px.ads.linkedin.com/collect?pid=785158709&fmt=gif",204,"image/gif"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.torra.com/v1/items\",\n \"headers\": {\n \"host\": \"api.torra.com\",\n \"connection\": \"keep-alive\",\n \"x-app-build\": \"4693\",\n \"x-auth-key\": \"sk_67f7ab9917a8aa6c2dd06610\",\n \"origin\": \"https://app.torra.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.torra.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"[{\\\"id\\\":\\\"INV-28356\\\",\\\"created_at\\\":\\\"2026-01-05T13:40:00Z\\\",\\\"customer\\\":\\\"Corvid Labs\\\",\\\"state\\\":\\\"draft\\\",\\\"amount_cents\\\":366999,\\\"currency\\\":\\\"USD\\\",\\\"due_date\\\":\\\"2026-04-21\\\",\\\"memo\\\":\\\"Bulk import times out\\\",\\\"contact\\\":{\\\"name\\\":\\\"Tomas Ito\\\",\\\"email\\\":\\\"ines.varga@mail.test\\\"}},{\\\"id\\\":\\\"INV-55231\\\",\\\"created_at\\\":\\\"2026-01-05T14:28:00Z\\\",\\\"customer\\\":\\\"Lumen & Sons\\\",\\\"state\\\":\\\"draft\\\",\\\"amount_cents\\\":589313,\\\"currency\\\":\\\"EUR\\\",\\\"due_date\\\":\\\"2026-05-19\\\",\\\"memo\\\":\\\"Bulk import times out\\\",\\\"contact\\\":{\\\"name\\\":\\\"Amara Okoye\\\",\\\"email\\\":\\\"sofia.duarte@corp.test\\\"}},{\\\"id\\\":\\\"INV-66182\\\",\\\"created_at\\\":\\\"2026-01-05T16:12:00Z\\\",\\\"customer\\\":\\\"Ostrava Tools\\\",\\\"state\\\":\\\"paid\\\",\\\"amount_cents\\\":774569,\\\"currency\\\":\\\"EUR\\\",\\\"due_date\\\":\\\"2026-04-20\\\",\\\"memo\\","results":{"c3a":[17.6,17.6,31.4,58.8,58.8,100.0,58.8],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,11,11,-1,11]}},{"id":"v3_single_05_nest_tickets","suite":"heal_v3","tier":"B","title":"Quoly Tickets API","goal":"# Quoly Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quoly.io/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:tickets","base_path","noise","token_expiry","etag_update","login_format:form","csrf_in:json","case:heal3","mutation:add_drift_nest"],"n_requests":14,"requests":[["GET","https://px.ads.linkedin.com/collect?pid=10350852&fmt=gif",204,"image/gif"],["GET","https://www.googletagmanager.com/gtag/js?id=G-820685516",200,"application/javascript"],["POST","https://api.quoly.io/v3/login",200,"application/json"],["GET","https://api.quoly.io/v3/items",200,"application/json"],["GET","https://api.quoly.io/v3/items?page_token=ZDE3NDAzNWM6MTA",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.quoly.io/v3/items/TCK-92686",200,"application/json"],["POST","https://api.quoly.io/v3/items",201,"application/json"],["GET","https://api.quoly.io/__flags",200,"application/json"],["GET","https://api.quoly.io/v3/items/TCK-65242",401,"application/json"],["POST","https://api.quoly.io/v3/login",200,"application/json"],["GET","https://api.quoly.io/v3/items/TCK-65242",200,"application/json"],["PATCH","https://api.quoly.io/v3/items/TCK-65242",200,"application/json"],["DELETE","https://api.quoly.io/v3/items/TCK-25735",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.quoly.io/v3/login\",\n \"headers\": {\n \"host\": \"api.quoly.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.quoly.io\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.quoly.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_59651c24\\\",\\\"csrf_token\\\":\\\"f1cd982ed64adbd2\\\"}\"\n }\n }\n}","results":{"c3a":[58.8,58.8,45.1,58.8,58.8,58.8,58.8],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[11,11,6,11,11,11,11]}},{"id":"v3_single_06_rate_limit_invoices","suite":"heal_v3","tier":"B","title":"Zanlo Invoices API","goal":"# Zanlo Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.zanlo.co/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:link_header","domain:invoices","base_path","noise","etag_update","hidden_header","login_format:json","csrf_in:header","case:heal3","mutation:add_rate_limit"],"n_requests":13,"requests":[["POST","https://api.zanlo.co/api/auth/login",200,"application/json"],["GET","https://api.zanlo.co/api/items",200,"application/json"],["GET","https://api.zanlo.co/api/items?p=2",200,"application/json"],["GET","https://api.zanlo.co/api/items/INV-88884",200,"application/json"],["GET","https://api.zanlo.co/",200,"text/html"],["POST","https://api.zanlo.co/api/items",429,"application/json"],["POST","https://api.zanlo.co/api/items",201,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-225345651&cid=225345651.225345651&en=page_view",204,"text/plain"],["GET","https://api.zanlo.co/api/items/INV-63225",200,"application/json"],["PATCH","https://api.zanlo.co/api/items/INV-63225",200,"application/json"],["GET","https://api.zanlo.co/ping",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["DELETE","https://api.zanlo.co/api/items/INV-97333",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.zanlo.co/api/auth/login\",\n \"headers\": {\n \"host\": \"api.zanlo.co\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-09-05\",\n \"origin\": \"https://app.zanlo.co\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.zanlo.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_e4b3136f\\\"}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,0.0,0.0,100.0,100.0],"c3b":[100.0,100.0,100.0,100.0,58.8,100.0,100.0]},"fails":{"c3a":[-1,-1,-1,3,0,-1,-1],"c3b":[-1,-1,-1,-1,4,-1,-1]}},{"id":"v3_single_07_rate_limit_samples","suite":"heal_v3","tier":"B","title":"Lumvo Samples API","goal":"# Lumvo Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.lumvo.app/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:samples","base_path","noise","token_expiry","login_format:form","case:heal3","mutation:add_rate_limit"],"n_requests":14,"requests":[["POST","https://api.lumvo.app/v2/login",200,"application/json"],["GET","https://api.lumvo.app/v2/samples",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/55cf1403d0e998a15df90932.woff2",200,"font/woff2"],["GET","https://api.lumvo.app/v2/samples/SMP-99483",200,"application/json"],["POST","https://api.lumvo.app/v2/samples",429,"application/json"],["POST","https://api.lumvo.app/v2/samples",201,"application/json"],["PATCH","https://api.lumvo.app/v2/samples/SMP-82443",200,"application/json"],["DELETE","https://api.lumvo.app/v2/samples/SMP-89594",401,"application/json"],["POST","https://api.lumvo.app/v2/login",429,"application/json"],["POST","https://api.lumvo.app/v2/login",200,"application/json"],["DELETE","https://api.lumvo.app/v2/samples/SMP-89594",204,"x-unknown"],["GET","https://api.lumvo.app/config.json",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.lumvo.app/v2/login\",\n \"headers\": {\n \"host\": \"api.lumvo.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.lumvo.app\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.lumvo.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"access_token\\\":\\\"tok_fa94dd30d0a680036e128718\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,23.5,23.5,100.0,0.0],"c3b":[100.0,100.0,72.5,100.0,23.5,23.5,100.0]},"fails":{"c3a":[-1,-1,-1,10,10,-1,3],"c3b":[-1,-1,6,-1,10,10,-1]}},{"id":"v3_single_08_async_create_bookings","suite":"heal_v3","tier":"B","title":"Lumik Bookings API","goal":"# Lumik Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.lumik.dev/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:link_header","domain:bookings","base_path","noise","envelope","case:heal3","mutation:add_async_create"],"n_requests":13,"requests":[["GET","https://api.lumik.dev/__flags",200,"application/json"],["GET","https://api.lumik.dev/api/records",200,"application/json"],["GET","https://api.lumik.dev/api/records?page=2",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://o244781291.ingest.sentry.io/api/244781291/envelope/?sentry_key=77691a46a95ab3a3ce9db102",200,"application/json"],["GET","https://api.lumik.dev/api/records/BKG-98839",200,"application/json"],["POST","https://api.lumik.dev/api/records",202,"application/json"],["GET","https://api.lumik.dev/api/jobs/job_6b31a8118211",200,"application/json"],["GET","https://api.lumik.dev/api/jobs/job_6b31a8118211",200,"application/json"],["GET","https://api.lumik.dev/api/jobs/job_6b31a8118211",200,"application/json"],["PATCH","https://api.lumik.dev/api/records/BKG-31365",200,"application/json"],["DELETE","https://api.lumik.dev/api/records/BKG-65139",204,"x-unknown"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.lumik.dev/__flags\",\n \"headers\": {\n \"host\": \"api.lumik.dev\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.lumik.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.lumik.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"a9bcc9ae\\\"}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,0.0,100.0,0.0,100.0],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,82.4]},"fails":{"c3a":[-1,-1,-1,0,-1,0,-1],"c3b":[-1,-1,-1,-1,-1,-1,2]}},{"id":"v3_single_09_async_create_shipments","suite":"heal_v3","tier":"B","title":"Nimlo Shipments API","goal":"# Nimlo Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.nimlo.app/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:shipments","base_path","noise","token_expiry","etag_update","envelope","login_format:json","case:heal3","mutation:add_async_create"],"n_requests":21,"requests":[["GET","https://cdn.segment.com/analytics.js/v1/4cfa3f64cfe3260b4be82d98/analytics.min.js",200,"application/javascript"],["POST","https://api.nimlo.app/api/sessions",200,"application/json"],["GET","https://api.nimlo.app/api/shipments",200,"application/json"],["GET","https://api.nimlo.app/api/shipments?p=2",200,"application/json"],["GET","https://api.nimlo.app/static/css/main.6f5c1c28.css",200,"text/css"],["GET","https://api.nimlo.app/static/css/main.2da31743.css",200,"text/css"],["GET","https://api.nimlo.app/api/shipments/SHP-10962",200,"application/json"],["POST","https://api.nimlo.app/api/shipments",202,"application/json"],["GET","https://api.nimlo.app/api/tasks/job_0a6028a9d77b",401,"application/json"],["POST","https://api.nimlo.app/api/sessions",200,"application/json"],["GET","https://api.nimlo.app/api/tasks/job_0a6028a9d77b",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.nimlo.app/api/tasks/job_0a6028a9d77b",200,"application/json"],["GET","https://api.nimlo.app/api/tasks/job_0a6028a9d77b",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/3d41871c9f594fcf6fad4439.woff2",200,"font/woff2"],["GET","https://api.nimlo.app/__flags",200,"application/json"],["GET","https://api.nimlo.app/api/shipments/SHP-78696",200,"application/json"],["PATCH","https://api.nimlo.app/api/shipments/SHP-78696",401,"application/json"],["POST","https://api.nimlo.app/api/sessions",200,"application/json"],["PATCH","https://api.nimlo.app/api/shipments/SHP-78696",200,"application/json"],["DELETE","https://api.nimlo.app/api/shipments/SHP-92712",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.nimlo.app/api/sessions\",\n \"headers\": {\n \"host\": \"api.nimlo.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.nimlo.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.nimlo.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"token\\\":\\\"tok_1ebfb8e0e5eeea21c5fb5f0e\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,0.0,82.4,100.0,100.0],"c3b":[100.0,100.0,100.0,0.0,0.0,100.0,5.9]},"fails":{"c3a":[-1,-1,-1,0,2,-1,-1],"c3b":[-1,-1,-1,0,0,-1,0]}},{"id":"v3_single_10_refresh_rotation_invoices","suite":"heal_v3","tier":"B","title":"Broium Invoices API","goal":"# Broium Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.broium.io/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:invoices","base_path","noise","etag_update","login_format:json","case:heal3","mutation:add_refresh_rotation"],"n_requests":14,"requests":[["POST","https://api.broium.io/v1/auth/login",200,"application/json"],["GET","https://api.broium.io/v1/invoices",200,"application/json"],["GET","https://api.broium.io/v1/invoices?p=2",200,"application/json"],["GET","https://api.broium.io/manifest.json",200,"application/json"],["GET","https://api.broium.io/static/js/main.71110ecf.js",200,"application/javascript"],["GET","https://api.broium.io/v1/invoices/INV-20491",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=640488871&fmt=gif",204,"image/gif"],["POST","https://api.broium.io/v1/invoices",201,"application/json"],["GET","https://api.broium.io/v1/invoices/INV-23928",401,"application/json"],["POST","https://api.broium.io/v1/refresh",200,"application/json"],["GET","https://api.broium.io/v1/invoices/INV-23928",200,"application/json"],["PATCH","https://api.broium.io/v1/invoices/INV-23928",200,"application/json"],["GET","https://api.broium.io/__flags",200,"application/json"],["DELETE","https://api.broium.io/v1/invoices/INV-29091",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.broium.io/v1/auth/login\",\n \"headers\": {\n \"host\": \"api.broium.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.broium.io\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.broium.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"jwt\\\":\\\"tok_2a13a596dc0786ccfdbb4e3f\\\",\\\"refresh_token\\\":\\\"rtk_df2cff13acf0915f59ba88b9\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[5.9,100.0,100.0,100.0,0.0,0.0,100.0],"c3b":[100.0,100.0,100.0,100.0,0.0,100.0,100.0]},"fails":{"c3a":[0,-1,-1,-1,0,0,-1],"c3b":[-1,-1,-1,-1,0,-1,-1]}},{"id":"v3_single_11_refresh_rotation_bookings","suite":"heal_v3","tier":"B","title":"Havna Bookings API","goal":"# Havna Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havna.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:bookings","base_path","noise","etag_update","hidden_header","login_format:form","case:heal3","mutation:add_refresh_rotation"],"n_requests":17,"requests":[["POST","https://api.havna.dev/v2/sessions",200,"application/json"],["GET","https://api.havna.dev/v2/items",200,"application/json"],["GET","https://api.havna.dev/v2/items?page_token=ODBmZTRhNGU6MTA",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.havna.dev/config.json",200,"application/json"],["GET","https://api.havna.dev/v2/items/BKG-32544",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-722740470",200,"application/javascript"],["POST","https://api.havna.dev/v2/items",401,"application/json"],["POST","https://api.havna.dev/v2/token/refresh",200,"application/json"],["POST","https://api.havna.dev/v2/items",201,"application/json"],["GET","https://api.havna.dev/v2/items/BKG-52720",200,"application/json"],["PATCH","https://api.havna.dev/v2/items/BKG-52720",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["DELETE","https://api.havna.dev/v2/items/BKG-77379",401,"application/json"],["POST","https://api.havna.dev/v2/token/refresh",200,"application/json"],["GET","https://api.havna.dev/static/js/main.0edc1445.js",200,"application/javascript"],["DELETE","https://api.havna.dev/v2/items/BKG-77379",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.havna.dev/v2/sessions\",\n \"headers\": {\n \"host\": \"api.havna.dev\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-09-04\",\n \"origin\": \"https://app.havna.dev\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havna.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"token\\\":\\\"tok_5cf3919cd3291772d02aee1e\\\",\\\"refresh_token\\\":\\\"rtk_e8e374199dd75405b027fe6b\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,100.0,100.0,100.0,100.0],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]}},{"id":"v3_single_12_idempotency_key_samples","suite":"heal_v3","tier":"B","title":"Solium Samples API","goal":"# Solium Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.solium.app/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:samples","base_path","noise","etag_update","hidden_header","login_format:json","csrf_in:json","case:heal3","mutation:add_idempotency_key"],"n_requests":10,"requests":[["GET","https://api.solium.app/robots.txt",200,"text/plain"],["POST","https://api.solium.app/v3/sessions",200,"application/json"],["GET","https://api.solium.app/v3/samples",200,"application/json"],["GET","https://api.solium.app/v3/samples/SMP-58624",200,"application/json"],["GET","https://api.solium.app/",200,"text/html"],["POST","https://api.solium.app/v3/samples",201,"application/json"],["GET","https://api.solium.app/v3/samples/SMP-72964",200,"application/json"],["PATCH","https://api.solium.app/v3/samples/SMP-72964",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["DELETE","https://api.solium.app/v3/samples/SMP-58105",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.solium.app/v3/sessions\",\n \"headers\": {\n \"host\": \"api.solium.app\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-04-13\",\n \"origin\": \"https://app.solium.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.solium.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_9b03d2b0\\\",\\\"csrf_token\\\":\\\"a930ba563b9db25b\\\"}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,100.0,58.8,100.0,100.0],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[-1,-1,-1,-1,4,-1,-1]}},{"id":"v3_single_13_idempotency_key_tickets","suite":"heal_v3","tier":"B","title":"Zanly Tickets API","goal":"# Zanly Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.zanly.co/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:tickets","base_path","noise","etag_update","envelope","case:heal3","mutation:add_idempotency_key"],"n_requests":10,"requests":[["GET","https://api.zanly.co/manifest.json",200,"application/json"],["GET","https://api.zanly.co/v2/items",200,"application/json"],["GET","https://api.zanly.co/v2/items?cursor=NTMzNGI0MmE6MTA",200,"application/json"],["GET","https://api.zanly.co/v2/items/TCK-66781",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-953330797",200,"application/javascript"],["POST","https://api.zanly.co/v2/items",201,"application/json"],["GET","https://api.zanly.co/v2/items/TCK-48858",200,"application/json"],["PATCH","https://api.zanly.co/v2/items/TCK-48858",200,"application/json"],["DELETE","https://api.zanly.co/v2/items/TCK-37584",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.zanly.co/manifest.json\",\n \"headers\": {\n \"host\": \"api.zanly.co\",\n \"connection\": \"keep-alive\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"manifest\",\n \"referer\": \"https://app.zanly.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"short_name\\\":\\\"App\\\",\\\"start_url\\\":\\\".\\\",\\\"display\\\":\\\"standalone\\\",\\\"icons\\\":[]}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,100.0,100.0,100.0,100.0],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]}},{"id":"v3_terse_56_cents+idempotency_key+moved_invoices","suite":"heal_v3","tier":"B","title":"Zanlo Invoices API","goal":"# Zanlo Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.zanlo.io/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:invoices","base_path","noise","etag_update","hidden_header","case:heal3","mutation:add_drift_cents","mutation:add_idempotency_key","mutation:add_moved"],"n_requests":10,"requests":[["GET","https://api.zanlo.io/v3/invoices",200,"application/json"],["GET","https://api.zanlo.io/v3/invoices?after=ZDQ0NGQ0YjM6MTA",200,"application/json"],["GET","https://api.zanlo.io/v3/entities/invoices/INV-42654",200,"application/json"],["POST","https://api.zanlo.io/v3/invoices",201,"application/json"],["GET","https://static.hotjar.com/c/hotjar-66063935.js?sv=6",200,"application/javascript"],["GET","https://api.zanlo.io/v3/entities/invoices/INV-81938",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-842049799.js?sv=6",200,"application/javascript"],["PATCH","https://api.zanlo.io/v3/entities/invoices/INV-81938",200,"application/json"],["DELETE","https://api.zanlo.io/v3/entities/invoices/INV-89041",204,"x-unknown"],["GET","https://static.hotjar.com/c/hotjar-522242529.js?sv=6",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.zanlo.io/v3/invoices\",\n \"headers\": {\n \"host\": \"api.zanlo.io\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-4.4\",\n \"x-auth-key\": \"sk_0a035ab6c97507ecd88a02b5\",\n \"origin\": \"https://app.zanlo.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.zanlo.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"results\\\":[{\\\"id\\\":\\\"INV-49121\\\",\\\"created_at\\\":\\\"2026-01-05T12:03:00Z\\\",\\\"customer\\\":\\\"Mosaic Freight\\\",\\\"state\\\":\\\"draft\\\",\\\"amount_cents\\\":734063,\\\"currency\\\":\\\"GBP\\\",\\\"due_date\\\":\\\"2026-06-22\\\",\\\"memo\\\":\\\"Search ignores accented names\\\",\\\"deposit_cents\\\":50978},{\\\"id\\\":\\\"INV-53498\\\",\\\"created_at\\\":\\\"2026-01-05T13:57:00Z\\\",\\\"customer\\\":\\\"Mosaic Freight\\\",\\\"state\\\":\\\"draft\\\",\\\"amount_cents\\\":644773,\\\"currency\\\":\\\"GBP\\\",\\\"due_date\\\":\\\"2026-08-04\\\",\\\"memo\\\":\\\"Bulk import times out\\\",\\\"deposit_cents\\\":44401},{\\\"id\\\":\\\"INV-14359\\\",\\\"created_at\\\":\\\"2026-01-05T15:38:00Z\\\",\\\"customer\\\":\\\"Corvid Labs\\\",\\\"state\\\":\\\"draft\\\",\\\"amount_cents\\\":222815,\\\"currency\\\":\\\"EUR\\\",\\\"due_date\\\":\\\"2026-01-01\\\",\\\"memo\\\":\\\"Cannot reset two-factor device\\\",\\\"deposit_cents\\\":60129},{\\\"id\\\":\\\"IN","results":{"c3a":[0.0,17.6,45.1,17.6,100.0,100.0,41.2],"c3b":[0.0,100.0,100.0,41.2,41.2,17.6,41.2]},"fails":{"c3a":[1,6,6,6,-1,-1,1],"c3b":[1,-1,-1,1,1,6,1]}},{"id":"v3_terse_57_rename+epoch+idempotency_key_tickets","suite":"heal_v3","tier":"B","title":"Pelant Tickets API","goal":"# Pelant Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pelant.net/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:tickets","base_path","noise","token_expiry","etag_update","login_format:form","csrf_in:json","case:heal3","mutation:add_drift_rename","mutation:add_drift_epoch","mutation:add_idempotency_key"],"n_requests":14,"requests":[["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=523126509&fmt=gif",204,"image/gif"],["POST","https://api.pelant.net/api/login",200,"application/json"],["GET","https://api.pelant.net/api/records",200,"application/json"],["GET","https://api.pelant.net/api/records?page_token=MDI4NmI2ZDE6MTA",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=733416426&fmt=gif",204,"image/gif"],["GET","https://api.pelant.net/api/records/TCK-13688",200,"application/json"],["POST","https://api.pelant.net/api/records",201,"application/json"],["GET","https://api.pelant.net/api/records/TCK-83602",401,"application/json"],["POST","https://api.pelant.net/api/login",200,"application/json"],["GET","https://api.pelant.net/api/records/TCK-83602",200,"application/json"],["PATCH","https://api.pelant.net/api/records/TCK-83602",200,"application/json"],["GET","https://api.pelant.net/__flags",200,"application/json"],["DELETE","https://api.pelant.net/api/records/TCK-93127",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.pelant.net\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pelant.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,31.4,0.0,17.6,100.0,11.8],"c3b":[41.2,41.2,100.0,11.8,17.6,0.0,100.0]},"fails":{"c3a":[6,6,6,1,4,-1,6],"c3b":[1,1,-1,6,6,1,-1]}},{"id":"v3_terse_58_nest+async_create+moved_shipments","suite":"heal_v3","tier":"B","title":"Quoton Shipments API","goal":"# Quoton Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quoton.io/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:shipments","base_path","noise","envelope","case:heal3","mutation:add_drift_nest","mutation:add_async_create","mutation:add_moved"],"n_requests":13,"requests":[["GET","https://api.quoton.io/favicon.ico",200,"image/x-icon"],["POST","https://o471610018.ingest.sentry.io/api/471610018/envelope/?sentry_key=fce0e232e3f146eda957d771",200,"application/json"],["GET","https://api.quoton.io/api/records",200,"application/json"],["GET","https://api.quoton.io/api/records?offset=10",200,"application/json"],["GET","https://api.quoton.io/api/entities/records/SHP-15611",200,"application/json"],["POST","https://o694327860.ingest.sentry.io/api/694327860/envelope/?sentry_key=2085c992cbb8e416c23fec71",200,"application/json"],["GET","https://api.quoton.io/config.json",200,"application/json"],["POST","https://api.quoton.io/api/records",202,"application/json"],["GET","https://api.quoton.io/api/tasks/job_aff5105ef1d0",200,"application/json"],["GET","https://api.quoton.io/api/tasks/job_aff5105ef1d0",200,"application/json"],["GET","https://api.quoton.io/api/tasks/job_aff5105ef1d0",200,"application/json"],["PATCH","https://api.quoton.io/api/entities/records/SHP-31651",200,"application/json"],["DELETE","https://api.quoton.io/api/entities/records/SHP-75451",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o471610018.ingest.sentry.io/api/471610018/envelope/?sentry_key=fce0e232e3f146eda957d771\",\n \"headers\": {\n \"host\": \"o471610018.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.quoton.io\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.quoton.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"7e4d2b40521a58048a595e4e\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,31.4,17.6,17.6,17.6,17.6],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,0.0]},"fails":{"c3a":[6,6,6,6,6,6,6],"c3b":[-1,-1,-1,-1,-1,-1,2]}},{"id":"v3_terse_59_cents+epoch+rate_limit_samples","suite":"heal_v3","tier":"B","title":"Nimlo Samples API","goal":"# Nimlo Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.nimlo.net/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:samples","base_path","noise","token_expiry","hidden_header","envelope","login_format:form","csrf_in:header","case:heal3","mutation:add_drift_cents","mutation:add_drift_epoch","mutation:add_rate_limit"],"n_requests":13,"requests":[["GET","https://api.nimlo.net/config.json",200,"application/json"],["POST","https://api.nimlo.net/api/login",200,"application/json"],["GET","https://api.nimlo.net/api/records",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-875338923.js?sv=6",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/d39c10aed389667a0779e10b/analytics.min.js",200,"application/javascript"],["GET","https://api.nimlo.net/api/records/SMP-88550",200,"application/json"],["POST","https://api.nimlo.net/api/records",201,"application/json"],["POST","https://o590739624.ingest.sentry.io/api/590739624/envelope/?sentry_key=f2dad501219289ad75e64539",200,"application/json"],["PATCH","https://api.nimlo.net/api/records/SMP-65632",200,"application/json"],["DELETE","https://api.nimlo.net/api/records/SMP-61891",429,"application/json"],["DELETE","https://api.nimlo.net/api/records/SMP-61891",401,"application/json"],["POST","https://api.nimlo.net/api/login",200,"application/json"],["DELETE","https://api.nimlo.net/api/records/SMP-61891",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.nimlo.net/config.json\",\n \"headers\": {\n \"host\": \"api.nimlo.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.nimlo.net\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.nimlo.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"823f03b2\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,58.8,23.5,11.8,0.0],"c3b":[23.5,94.1,70.6,0.0,23.5,17.6,0.0]},"fails":{"c3a":[6,6,6,1,10,6,10],"c3b":[10,4,6,10,10,10,10]}},{"id":"v3_terse_60_enum+rate_limit+refresh_rotation_samples","suite":"heal_v3","tier":"B","title":"Fenvo Samples API","goal":"# Fenvo Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.fenvo.co/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:samples","base_path","noise","login_format:json","case:heal3","mutation:add_drift_enum","mutation:add_rate_limit","mutation:add_refresh_rotation"],"n_requests":13,"requests":[["POST","https://api.fenvo.co/v2/sessions",200,"application/json"],["GET","https://api.fenvo.co/config.json",200,"application/json"],["GET","https://api.fenvo.co/v2/records",200,"application/json"],["GET","https://api.fenvo.co/v2/records/SMP-83758",200,"application/json"],["POST","https://api.fenvo.co/v2/records",201,"application/json"],["PATCH","https://api.fenvo.co/v2/records/SMP-23278",200,"application/json"],["POST","https://o900384202.ingest.sentry.io/api/900384202/envelope/?sentry_key=87820fc94438f49229f30c2e",200,"application/json"],["DELETE","https://api.fenvo.co/v2/records/SMP-90042",429,"application/json"],["DELETE","https://api.fenvo.co/v2/records/SMP-90042",401,"application/json"],["POST","https://api.fenvo.co/v2/auth/refresh",200,"application/json"],["DELETE","https://api.fenvo.co/v2/records/SMP-90042",204,"x-unknown"],["GET","https://www.googletagmanager.com/gtag/js?id=G-110170020",200,"application/javascript"],["GET","https://api.fenvo.co/manifest.json",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.fenvo.co/v2/sessions\",\n \"headers\": {\n \"host\": \"api.fenvo.co\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.fenvo.co\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.fenvo.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"token\\\":\\\"tok_dd9752d514b44b9161b5cb42\\\",\\\"refresh\\\":\\\"rtk_b0a0a5d37615cec477fabcb4\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[0.0,17.6,15.7,17.6,0.0,0.0,0.0],"c3b":[23.5,100.0,100.0,17.6,23.5,23.5,0.0]},"fails":{"c3a":[10,1,1,1,10,10,10],"c3b":[10,-1,-1,1,10,10,10]}},{"id":"v3_terse_61_rename+nest+moved_invoices","suite":"heal_v3","tier":"B","title":"Nimik Invoices API","goal":"# Nimik Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.nimik.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:link_header","domain:invoices","base_path","noise","token_expiry","envelope","login_format:json","csrf_in:header","case:heal3","mutation:add_drift_rename","mutation:add_drift_nest","mutation:add_moved"],"n_requests":13,"requests":[["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-438591810&cid=438591810.438591810&en=page_view",204,"text/plain"],["POST","https://api.nimik.dev/v2/auth/login",200,"application/json"],["GET","https://api.nimik.dev/v2/records",200,"application/json"],["GET","https://api.nimik.dev/v2/records?page=2",200,"application/json"],["GET","https://api.nimik.dev/v2/data/records/INV-38704",200,"application/json"],["GET","https://api.nimik.dev/ping",200,"application/json"],["POST","https://api.nimik.dev/v2/records",201,"application/json"],["PATCH","https://api.nimik.dev/v2/data/records/INV-27613",401,"application/json"],["POST","https://api.nimik.dev/v2/auth/login",200,"application/json"],["PATCH","https://api.nimik.dev/v2/data/records/INV-27613",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/e8118b805a4a1731ebb649e7.woff2",200,"font/woff2"],["DELETE","https://api.nimik.dev/v2/data/records/INV-42193",204,"x-unknown"],["GET","https://api.nimik.dev/robots.txt",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.nimik.dev/v2/auth/login\",\n \"headers\": {\n \"host\": \"api.nimik.dev\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.nimik.dev\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.nimik.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_eb9e8e2a\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,58.8,17.6,17.6],"c3b":[100.0,100.0,100.0,0.0,100.0,100.0,17.6]},"fails":{"c3a":[6,6,6,6,11,6,6],"c3b":[-1,-1,-1,0,-1,-1,6]}},{"id":"v3_terse_62_cents+async_create+refresh_rotation_tickets","suite":"heal_v3","tier":"B","title":"Zanrix Tickets API","goal":"# Zanrix Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.zanrix.net/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:offset","domain:tickets","base_path","noise","etag_update","login_format:json","case:heal3","mutation:add_drift_cents","mutation:add_async_create","mutation:add_refresh_rotation"],"n_requests":24,"requests":[["POST","https://api.zanrix.net/v2/auth/login",200,"application/json"],["GET","https://api.zanrix.net/v2/items",200,"application/json"],["GET","https://api.zanrix.net/v2/items?start=10",200,"application/json"],["GET","https://api.zanrix.net/__flags",200,"application/json"],["GET","https://api.zanrix.net/v2/items/TCK-55174",200,"application/json"],["POST","https://api.zanrix.net/v2/items",401,"application/json"],["POST","https://api.zanrix.net/v2/refresh",200,"application/json"],["POST","https://api.zanrix.net/v2/items",202,"application/json"],["GET","https://api.zanrix.net/v2/jobs/job_50fde776f4b4",200,"application/json"],["GET","https://api.zanrix.net/v2/jobs/job_50fde776f4b4",200,"application/json"],["GET","https://api.zanrix.net/v2/jobs/job_50fde776f4b4",401,"application/json"],["POST","https://api.zanrix.net/v2/refresh",200,"application/json"],["GET","https://api.zanrix.net/v2/jobs/job_50fde776f4b4",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-660370697",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=433795713&fmt=gif",204,"image/gif"],["GET","https://api.zanrix.net/v2/items/TCK-47452",200,"application/json"],["PATCH","https://api.zanrix.net/v2/items/TCK-47452",200,"application/json"],["DELETE","https://api.zanrix.net/v2/items/TCK-22140",401,"application/json"],["POST","https://api.zanrix.net/v2/refresh",200,"application/json"],["DELETE","https://api.zanrix.net/v2/items/TCK-22140",204,"x-unknown"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.zanrix.net/static/css/main.038da116.css",200,"text/css"],["GET","https://fonts.gstatic.com/s/inter/v13/cae4a35519ca1c50906c1c6b.woff2",200,"font/woff2"],["GET","https://api.zanrix.net/manifest.json",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.zanrix.net/v2/auth/login\",\n \"headers\": {\n \"host\": \"api.zanrix.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.zanrix.net\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.zanrix.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"access_token\\\":\\\"tok_baf5a43d6d191b92f26d0121\\\",\\\"refresh\\\":\\\"rtk_9f87c5a807592ec5bec9aa05\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[58.8,17.6,17.6,58.8,17.6,17.6,17.6],"c3b":[100.0,100.0,100.0,82.4,100.0,100.0,100.0]},"fails":{"c3a":[11,6,6,11,6,6,6],"c3b":[-1,-1,-1,11,-1,-1,-1]}},{"id":"v3_terse_63_epoch+nest+idempotency_key_bookings","suite":"heal_v3","tier":"B","title":"Oriora Bookings API","goal":"# Oriora Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.oriora.co/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:bookings","base_path","noise","case:heal3","mutation:add_drift_epoch","mutation:add_drift_nest","mutation:add_idempotency_key"],"n_requests":9,"requests":[["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-859360434&cid=859360434.859360434&en=page_view",204,"text/plain"],["GET","https://api.oriora.co/v1/items",200,"application/json"],["GET","https://api.oriora.co/v1/items?cursor=NTg3OWNkOGM6MTA",200,"application/json"],["GET","https://api.oriora.co/v1/items/BKG-34986",200,"application/json"],["POST","https://api.oriora.co/v1/items",201,"application/json"],["PATCH","https://api.oriora.co/v1/items/BKG-39885",200,"application/json"],["DELETE","https://api.oriora.co/v1/items/BKG-16440",204,"x-unknown"],["POST","https://o788133648.ingest.sentry.io/api/788133648/envelope/?sentry_key=59bfed2b49180a7314ce600d",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-196860769",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.oriora.co/v1/items\",\n \"headers\": {\n \"host\": \"api.oriora.co\",\n \"connection\": \"keep-alive\",\n \"x-api-token\": \"sk_04c2841f0d7bc9cfdc1a86f5\",\n \"origin\": \"https://app.oriora.co\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.oriora.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"items\\\":[{\\\"id\\\":\\\"BKG-16440\\\",\\\"created_at\\\":1767614280,\\\"guest\\\":\\\"Ravi Menon\\\",\\\"room\\\":\\\"Aurora\\\",\\\"starts_on\\\":\\\"2026-07-28\\\",\\\"nights\\\":10,\\\"party_size\\\":1,\\\"confirmed\\\":false,\\\"owner\\\":{\\\"name\\\":\\\"Elin Berg\\\",\\\"email\\\":\\\"sofia.duarte@corp.test\\\"}},{\\\"id\\\":\\\"BKG-22030\\\",\\\"created_at\\\":1767616200,\\\"guest\\\":\\\"Tomas Ito\\\",\\\"room\\\":\\\"Dune\\\",\\\"starts_on\\\":\\\"2026-09-29\\\",\\\"nights\\\":12,\\\"party_size\\\":3,\\\"confirmed\\\":true,\\\"owner\\\":{\\\"name\\\":\\\"Dev Patel\\\",\\\"email\\\":\\\"kofi.mensah@corp.test\\\"}},{\\\"id\\\":\\\"BKG-20622\\\",\\\"created_at\\\":1767623460,\\\"guest\\\":\\\"Tomas Ito\\\",\\\"room\\\":\\\"Ember\\\",\\\"starts_on\\\":\\\"2026-01-26\\\",\\\"nights\\\":12,\\\"party_size\\\":4,\\\"confirmed\\\":true,\\\"owner\\\":{\\\"name\\\":\\\"Lena Brandt\\\",\\\"email\\\":\\\"lena.brandt@example.org\\\"}},{\\\"id\\\":\\\"BKG-34986\\\",\\\"created_at\\\":1767627480,\\\"guest\\\":\\\"Tomas","results":{"c3a":[17.6,17.6,58.8,17.6,17.6,41.2,58.8],"c3b":[0.0,41.2,100.0,17.6,100.0,17.6,0.0]},"fails":{"c3a":[6,6,11,6,6,1,11],"c3b":[1,1,-1,6,-1,6,1]}},{"id":"v3_misleading_48_enum+refresh_rotation+idempotency_key_shipments","suite":"heal_v3_hint","tier":"B","title":"Havik Shipments API","goal":"# Havik Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havik.com/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:shipments","base_path","noise","envelope","login_format:form","case:heal3","mutation:add_drift_enum","mutation:add_refresh_rotation","mutation:add_idempotency_key"],"n_requests":13,"requests":[["GET","https://api.havik.com/config.json",200,"application/json"],["POST","https://api.havik.com/v3/sessions",200,"application/json"],["GET","https://api.havik.com/v3/records",200,"application/json"],["GET","https://api.havik.com/v3/records?page=2",200,"application/json"],["GET","https://api.havik.com/v3/records/SHP-99583",200,"application/json"],["POST","https://api.havik.com/v3/records",201,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["PATCH","https://api.havik.com/v3/records/SHP-52524",401,"application/json"],["POST","https://api.havik.com/v3/token/refresh",200,"application/json"],["PATCH","https://api.havik.com/v3/records/SHP-52524",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["DELETE","https://api.havik.com/v3/records/SHP-22537",204,"x-unknown"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.havik.com/config.json\",\n \"headers\": {\n \"host\": \"api.havik.com\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.havik.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havik.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"8f283e24\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}","results":{"c3a":[41.2,100.0,68.6,0.0,17.6,100.0,0.0],"c3b":[41.2,100.0,100.0,0.0,41.2,100.0,58.8]},"fails":{"c3a":[1,-1,0,0,6,-1,1],"c3b":[1,-1,-1,0,1,-1,4]}},{"id":"v3_misleading_49_rename+enum+rate_limit_samples","suite":"heal_v3_hint","tier":"B","title":"Quora Samples API","goal":"# Quora Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quora.co/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:samples","base_path","noise","token_expiry","envelope","login_format:json","csrf_in:header","case:heal3","mutation:add_drift_rename","mutation:add_drift_enum","mutation:add_rate_limit"],"n_requests":14,"requests":[["GET","https://api.quora.co/__flags",200,"application/json"],["POST","https://api.quora.co/api/sessions",200,"application/json"],["GET","https://api.quora.co/api/samples",200,"application/json"],["GET","https://api.quora.co/api/samples?start=10",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.quora.co/api/samples/SMP-46046",200,"application/json"],["POST","https://api.quora.co/api/samples",201,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["PATCH","https://api.quora.co/api/samples/SMP-52694",429,"application/json"],["PATCH","https://api.quora.co/api/samples/SMP-52694",401,"application/json"],["POST","https://api.quora.co/api/sessions",200,"application/json"],["PATCH","https://api.quora.co/api/samples/SMP-52694",200,"application/json"],["DELETE","https://api.quora.co/api/samples/SMP-71892",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.quora.co/__flags\",\n \"headers\": {\n \"host\": \"api.quora.co\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.quora.co\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.quora.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"a1567b32\\\"}\"\n }\n }\n}","results":{"c3a":[0.0,0.0,35.3,5.9,11.8,88.2,17.6],"c3b":[5.9,88.2,94.1,0.0,5.9,5.9,76.5]},"fails":{"c3a":[1,1,3,6,6,10,1],"c3b":[6,10,10,6,6,6,10]}},{"id":"v3_misleading_50_nest+idempotency_key+moved_bookings","suite":"heal_v3_hint","tier":"B","title":"Oriant Bookings API","goal":"# Oriant Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.oriant.app/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:bookings","base_path","noise","login_format:json","csrf_in:header","case:heal3","mutation:add_drift_nest","mutation:add_idempotency_key","mutation:add_moved"],"n_requests":9,"requests":[["POST","https://api.oriant.app/v3/auth/login",200,"application/json"],["GET","https://api.oriant.app/v3/bookings",200,"application/json"],["GET","https://api.oriant.app/static/js/main.e862edae.js",200,"application/javascript"],["GET","https://api.oriant.app/v3/data/bookings/BKG-68815",200,"application/json"],["POST","https://api.oriant.app/v3/bookings",201,"application/json"],["PATCH","https://api.oriant.app/v3/data/bookings/BKG-58073",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-690163237&cid=690163237.690163237&en=page_view",204,"text/plain"],["DELETE","https://api.oriant.app/v3/data/bookings/BKG-34411",204,"x-unknown"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.oriant.app/v3/auth/login\",\n \"headers\": {\n \"host\": \"api.oriant.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.oriant.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.oriant.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_44d245c0\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,11.8,58.8,17.6,17.6,17.6],"c3b":[100.0,100.0,100.0,58.8,100.0,58.8,100.0]},"fails":{"c3a":[6,6,6,11,6,6,6],"c3b":[-1,-1,-1,4,-1,4,-1]}},{"id":"v3_misleading_51_cents+enum+moved_samples","suite":"heal_v3_hint","tier":"B","title":"Traly Samples API","goal":"# Traly Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.traly.app/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:none","domain:samples","base_path","noise","envelope","case:heal3","mutation:add_drift_cents","mutation:add_drift_enum","mutation:add_moved"],"n_requests":7,"requests":[["GET","https://api.traly.app/robots.txt",200,"text/plain"],["GET","https://api.traly.app/v3/samples",200,"application/json"],["GET","https://api.traly.app/v3/data/samples/SMP-60873",200,"application/json"],["POST","https://api.traly.app/v3/samples",201,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["PATCH","https://api.traly.app/v3/data/samples/SMP-54803",200,"application/json"],["DELETE","https://api.traly.app/v3/data/samples/SMP-49388",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.traly.app/v3/samples\",\n \"headers\": {\n \"host\": \"api.traly.app\",\n \"connection\": \"keep-alive\",\n \"x-api-key\": \"sk_61bfea91ceec5cb92d612a0c\",\n \"origin\": \"https://app.traly.app\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.traly.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"SMP-16217\\\",\\\"created_at\\\":\\\"2026-01-05T13:11:00Z\\\",\\\"assay\\\":\\\"ELISA\\\",\\\"lab\\\":\\\"summit\\\",\\\"volume_ul\\\":178.8,\\\"collected_on\\\":\\\"2026-10-29\\\",\\\"batch\\\":\\\"B-3072\\\",\\\"hazardous\\\":false,\\\"total_cents\\\":51798},{\\\"id\\\":\\\"SMP-44205\\\",\\\"created_at\\\":\\\"2026-01-05T15:21:00Z\\\",\\\"assay\\\":\\\"ELISA\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":783.2,\\\"collected_on\\\":\\\"2026-04-08\\\",\\\"batch\\\":\\\"B-5328\\\",\\\"hazardous\\\":false,\\\"total_cents\\\":26327},{\\\"id\\\":\\\"SMP-94924\\\",\\\"created_at\\\":\\\"2026-01-05T17:15:00Z\\\",\\\"assay\\\":\\\"CYTOMETRY\\\",\\\"lab\\\":\\\"harbor\\\",\\\"volume_ul\\\":205.0,\\\"collected_on\\\":\\\"2026-02-01\\\",\\\"batch\\\":\\\"B-9761\\\",\\\"hazardous\\\":false,\\\"total_cents\\\":64956},{\\\"id\\\":\\\"SMP-26327\\\",\\\"created_at\\\":\\\"2026-01-05T18:40:00Z\\\",\\\"assay\\\":\\\"ELISA\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":514.4,\\\"collected_on\\\":\\\"2026-0","results":{"c3a":[17.6,0.0,17.6,100.0,0.0,100.0,17.6],"c3b":[100.0,100.0,100.0,100.0,100.0,35.3,100.0]},"fails":{"c3a":[6,2,6,-1,2,-1,6],"c3b":[-1,-1,-1,-1,-1,2,-1]}},{"id":"v3_misleading_52_epoch+async_create+refresh_rotation_tickets","suite":"heal_v3_hint","tier":"B","title":"Havna Tickets API","goal":"# Havna Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havna.io/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:offset","domain:tickets","base_path","noise","hidden_header","envelope","login_format:json","case:heal3","mutation:add_drift_epoch","mutation:add_async_create","mutation:add_refresh_rotation"],"n_requests":20,"requests":[["POST","https://api.havna.io/v1/auth/token",200,"application/json"],["GET","https://api.havna.io/v1/items",200,"application/json"],["GET","https://api.havna.io/v1/items?start=10",200,"application/json"],["GET","https://api.havna.io/robots.txt",200,"text/plain"],["GET","https://api.havna.io/config.json",200,"application/json"],["GET","https://api.havna.io/v1/items/TCK-74913",200,"application/json"],["GET","https://api.havna.io/manifest.json",200,"application/json"],["POST","https://api.havna.io/v1/items",401,"application/json"],["POST","https://api.havna.io/v1/sessions/refresh",200,"application/json"],["POST","https://api.havna.io/v1/items",202,"application/json"],["GET","https://api.havna.io/v1/tasks/job_2b765a71ae21",200,"application/json"],["GET","https://api.havna.io/v1/tasks/job_2b765a71ae21",200,"application/json"],["GET","https://api.havna.io/v1/tasks/job_2b765a71ae21",401,"application/json"],["POST","https://api.havna.io/v1/sessions/refresh",200,"application/json"],["GET","https://api.havna.io/v1/tasks/job_2b765a71ae21",200,"application/json"],["GET","https://api.havna.io/robots.txt",200,"text/plain"],["PATCH","https://api.havna.io/v1/items/TCK-64326",200,"application/json"],["DELETE","https://api.havna.io/v1/items/TCK-38077",204,"x-unknown"],["GET","https://api.havna.io/",200,"text/html"],["GET","https://api.havna.io/favicon.ico",200,"image/x-icon"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.havna.io/v1/auth/token\",\n \"headers\": {\n \"host\": \"api.havna.io\",\n \"connection\": \"keep-alive\",\n \"x-client-version\": \"3.5.5\",\n \"origin\": \"https://app.havna.io\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havna.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"token\\\":\\\"tok_6ec48cfd8efdae7a7e3943fe\\\",\\\"refresh_token\\\":\\\"rtk_1c6136a7692af5891dc81c76\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,17.6,17.6,17.6],"c3b":[100.0,0.0,72.5,17.6,82.4,100.0,17.6]},"fails":{"c3a":[6,6,6,6,6,6,6],"c3b":[-1,2,6,6,2,-1,3]}},{"id":"v3_misleading_53_rename+cents+rate_limit_shipments","suite":"heal_v3_hint","tier":"B","title":"Nimora Shipments API","goal":"# Nimora Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.nimora.app/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:shipments","base_path","noise","hidden_header","login_format:form","csrf_in:json","case:heal3","mutation:add_drift_rename","mutation:add_drift_cents","mutation:add_rate_limit"],"n_requests":10,"requests":[["POST","https://api.nimora.app/v1/sessions",200,"application/json"],["GET","https://api.nimora.app/v1/shipments",200,"application/json"],["GET","https://api.nimora.app/v1/shipments/SHP-56128",200,"application/json"],["GET","https://api.nimora.app/static/js/main.4b97e269.js",200,"application/javascript"],["POST","https://api.nimora.app/v1/shipments",201,"application/json"],["PATCH","https://api.nimora.app/v1/shipments/SHP-23028",429,"application/json"],["PATCH","https://api.nimora.app/v1/shipments/SHP-23028",200,"application/json"],["POST","https://o38325624.ingest.sentry.io/api/38325624/envelope/?sentry_key=fb4bcb831de37612f7c425ea",200,"application/json"],["DELETE","https://api.nimora.app/v1/shipments/SHP-45352",204,"x-unknown"],["GET","https://static.hotjar.com/c/hotjar-990037103.js?sv=6",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.nimora.app/v1/sessions\",\n \"headers\": {\n \"host\": \"api.nimora.app\",\n \"connection\": \"keep-alive\",\n \"x-client-version\": \"3.14.1\",\n \"origin\": \"https://app.nimora.app\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.nimora.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_a434377f\\\",\\\"csrf_token\\\":\\\"526f60a9407ced07\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,45.1,17.6,17.6,100.0,17.6],"c3b":[100.0,100.0,100.0,17.6,100.0,58.8,100.0]},"fails":{"c3a":[6,6,6,6,4,-1,6],"c3b":[-1,-1,-1,4,-1,4,-1]}},{"id":"v3_misleading_54_epoch+async_create+refresh_rotation_invoices","suite":"heal_v3_hint","tier":"B","title":"Kesrix Invoices API","goal":"# Kesrix Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.kesrix.com/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:invoices","base_path","noise","etag_update","hidden_header","login_format:json","case:heal3","mutation:add_drift_epoch","mutation:add_async_create","mutation:add_refresh_rotation"],"n_requests":19,"requests":[["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.kesrix.com/",200,"text/html"],["POST","https://api.kesrix.com/api/auth/token",200,"application/json"],["GET","https://api.kesrix.com/api/records",200,"application/json"],["GET","https://api.kesrix.com/api/records/INV-66741",200,"application/json"],["GET","https://api.kesrix.com/sockjs-node/info",200,"application/json"],["POST","https://api.kesrix.com/api/records",202,"application/json"],["GET","https://api.kesrix.com/api/operations/job_625555ecc3ec",401,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=943194774&fmt=gif",204,"image/gif"],["POST","https://api.kesrix.com/api/token/refresh",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.kesrix.com/api/operations/job_625555ecc3ec",200,"application/json"],["GET","https://api.kesrix.com/api/operations/job_625555ecc3ec",200,"application/json"],["GET","https://api.kesrix.com/api/records/INV-71443",200,"application/json"],["PATCH","https://api.kesrix.com/api/records/INV-71443",401,"application/json"],["POST","https://api.kesrix.com/api/token/refresh",200,"application/json"],["PATCH","https://api.kesrix.com/api/records/INV-71443",200,"application/json"],["GET","https://api.kesrix.com/static/media/logo.6cf9e3e4.svg",200,"image/svg+xml"],["DELETE","https://api.kesrix.com/api/records/INV-58862",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.kesrix.com/api/auth/token\",\n \"headers\": {\n \"host\": \"api.kesrix.com\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-02-18\",\n \"origin\": \"https://app.kesrix.com\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.kesrix.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"jwt\\\":\\\"tok_7dc502bf42be5ac7bf433f48\\\",\\\"refresh\\\":\\\"rtk_4e20141da05530f18e17ec61\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,17.6,17.6,17.6],"c3b":[82.4,82.4,94.1,82.4,82.4,0.0,82.4]},"fails":{"c3a":[6,6,6,6,6,6,6],"c3b":[2,2,2,2,2,2,2]}},{"id":"v3_misleading_55_nest+enum+rate_limit_bookings","suite":"heal_v3_hint","tier":"B","title":"Solium Bookings API","goal":"# Solium Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n- `CHANGELOG.md`: the release notes of the new version of the API.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.solium.io/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:bookings","base_path","noise","etag_update","case:heal3","mutation:add_drift_nest","mutation:add_drift_enum","mutation:add_rate_limit"],"n_requests":11,"requests":[["GET","https://api.solium.io/api/items",200,"application/json"],["GET","https://api.solium.io/api/items?skip=10",200,"application/json"],["GET","https://api.solium.io/api/items/BKG-32835",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://api.solium.io/api/items",201,"application/json"],["GET","https://api.solium.io/api/items/BKG-78827",200,"application/json"],["PATCH","https://api.solium.io/api/items/BKG-78827",429,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/7a9cfcbac19eae524eeecbf0/analytics.min.js",200,"application/javascript"],["PATCH","https://api.solium.io/api/items/BKG-78827",200,"application/json"],["DELETE","https://api.solium.io/api/items/BKG-76494",204,"x-unknown"],["GET","https://static.hotjar.com/c/hotjar-457999144.js?sv=6",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.solium.io/api/items\",\n \"headers\": {\n \"host\": \"api.solium.io\",\n \"connection\": \"keep-alive\",\n \"x-api-token\": \"sk_46e4bfedd5eae740807ffcc7\",\n \"origin\": \"https://app.solium.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.solium.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"results\\\":[{\\\"id\\\":\\\"BKG-68204\\\",\\\"created_at\\\":\\\"2026-01-05T18:54:00Z\\\",\\\"guest\\\":\\\"Dev Patel\\\",\\\"room\\\":\\\"st_Cedar\\\",\\\"starts_on\\\":\\\"2026-08-24\\\",\\\"nights\\\":13,\\\"party_size\\\":5,\\\"confirmed\\\":false,\\\"requester\\\":{\\\"name\\\":\\\"Kofi Mensah\\\",\\\"email\\\":\\\"sofia.duarte@example.org\\\"}},{\\\"id\\\":\\\"BKG-39297\\\",\\\"created_at\\\":\\\"2026-01-05T20:22:00Z\\\",\\\"guest\\\":\\\"Marta Lindqvist\\\",\\\"room\\\":\\\"st_Dune\\\",\\\"starts_on\\\":\\\"2026-05-30\\\",\\\"nights\\\":9,\\\"party_size\\\":5,\\\"confirmed\\\":false,\\\"requester\\\":{\\\"name\\\":\\\"Ines Varga\\\",\\\"email\\\":\\\"sofia.duarte@mail.test\\\"}},{\\\"id\\\":\\\"BKG-16600\\\",\\\"created_at\\\":\\\"2026-01-05T21:55:00Z\\\",\\\"guest\\\":\\\"Ines Varga\\\",\\\"room\\\":\\\"st_Ember\\\",\\\"starts_on\\\":\\\"2026-04-05\\\",\\\"nights\\\":6,\\\"party_size\\\":7,\\\"confirmed\\\":true,\\\"requester\\\":{\\\"name\\\":\\\"Lena Brandt\\\",\\\"email\\\":\\\"ravi.menon@exampl","results":{"c3a":[17.6,17.6,45.1,17.6,17.6,100.0,100.0],"c3b":[100.0,88.2,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,6,6,-1,-1],"c3b":[-1,6,-1,-1,-1,-1,-1]}},{"id":"v3_partial_32_rename+async_create+moved_shipments","suite":"heal_v3_hint","tier":"B","title":"Zanna Shipments API","goal":"# Zanna Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.zanna.app/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:link_header","domain:shipments","base_path","noise","token_expiry","hidden_header","login_format:json","csrf_in:header","case:heal3","mutation:add_drift_rename","mutation:add_async_create","mutation:add_moved"],"n_requests":13,"requests":[["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-798927952&cid=798927952.798927952&en=page_view",204,"text/plain"],["POST","https://api.zanna.app/v1/auth/login",200,"application/json"],["GET","https://api.zanna.app/v1/shipments",200,"application/json"],["GET","https://api.zanna.app/v1/shipments?p=2",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.zanna.app/sockjs-node/info",200,"application/json"],["GET","https://api.zanna.app/static/media/logo.7134cefe.svg",200,"image/svg+xml"],["GET","https://api.zanna.app/v1/entities/shipments/SHP-21212",200,"application/json"],["POST","https://api.zanna.app/v1/shipments",202,"application/json"],["GET","https://api.zanna.app/v1/tasks/job_98cb69786fd0",401,"application/json"],["POST","https://api.zanna.app/v1/auth/login",200,"application/json"],["GET","https://api.zanna.app/v1/tasks/job_98cb69786fd0",200,"application/json"],["GET","https://api.zanna.app/v1/tasks/job_98cb69786fd0",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.zanna.app/v1/auth/login\",\n \"headers\": {\n \"host\": \"api.zanna.app\",\n \"connection\": \"keep-alive\",\n \"x-client-version\": \"4.3.4\",\n \"origin\": \"https://app.zanna.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.zanna.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_b39e265b\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,0.0,0.0,17.6,17.6],"c3b":[100.0,82.4,100.0,0.0,0.0,100.0,17.6]},"fails":{"c3a":[6,6,6,0,0,2,6],"c3b":[-1,2,-1,0,0,-1,6]}},{"id":"v3_partial_33_cents+enum+refresh_rotation_invoices","suite":"heal_v3_hint","tier":"B","title":"Brora Invoices API","goal":"# Brora Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.brora.app/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:invoices","base_path","noise","etag_update","login_format:form","case:heal3","mutation:add_drift_cents","mutation:add_drift_enum","mutation:add_refresh_rotation"],"n_requests":11,"requests":[["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://api.brora.app/api/auth/login",200,"application/json"],["GET","https://api.brora.app/api/records",200,"application/json"],["GET","https://api.brora.app/favicon.ico",200,"image/x-icon"],["GET","https://api.brora.app/api/records",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.brora.app/api/records",200,"application/json"],["GET","https://api.brora.app/api/records",200,"application/json"],["GET","https://api.brora.app/api/records",401,"application/json"],["POST","https://api.brora.app/api/auth/refresh",200,"application/json"],["GET","https://api.brora.app/api/records",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.brora.app/api/auth/login\",\n \"headers\": {\n \"host\": \"api.brora.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.brora.app\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.brora.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"token\\\":\\\"tok_1033d7a209526215b6070b2a\\\",\\\"refresh_token\\\":\\\"rtk_069fdd780177c8b5fd1acd2f\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,51.0,58.8,58.8,58.8,58.8],"c3b":[94.1,47.1,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,1,5,5,1,5],"c3b":[4,10,-1,-1,-1,-1,-1]}},{"id":"v3_partial_34_nest+async_create+idempotency_key_samples","suite":"heal_v3_hint","tier":"B","title":"Traton Samples API","goal":"# Traton Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.traton.dev/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:samples","base_path","noise","hidden_header","case:heal3","mutation:add_drift_nest","mutation:add_async_create","mutation:add_idempotency_key"],"n_requests":7,"requests":[["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.traton.dev/v3/items",200,"application/json"],["GET","https://api.traton.dev/v3/items?offset=10",200,"application/json"],["POST","https://api.traton.dev/v3/items",202,"application/json"],["POST","https://o131564859.ingest.sentry.io/api/131564859/envelope/?sentry_key=267e29190b9d54c26b70c477",200,"application/json"],["GET","https://api.traton.dev/v3/operations/job_7a91447f74cd",200,"application/json"],["GET","https://api.traton.dev/v3/operations/job_7a91447f74cd",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.traton.dev/v3/items\",\n \"headers\": {\n \"host\": \"api.traton.dev\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-02-18\",\n \"x-api-token\": \"sk_d978a699660456285e0bc0a8\",\n \"origin\": \"https://app.traton.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.traton.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"records\\\":[{\\\"id\\\":\\\"SMP-81994\\\",\\\"created_at\\\":\\\"2026-01-05T13:50:00Z\\\",\\\"assay\\\":\\\"mass_spec\\\",\\\"lab\\\":\\\"harbor\\\",\\\"volume_ul\\\":68.7,\\\"collected_on\\\":\\\"2026-05-17\\\",\\\"batch\\\":\\\"B-9614\\\",\\\"hazardous\\\":false,\\\"owner\\\":{\\\"name\\\":\\\"Elin Berg\\\",\\\"email\\\":\\\"kofi.mensah@corp.test\\\"}},{\\\"id\\\":\\\"SMP-52432\\\",\\\"created_at\\\":\\\"2026-01-05T15:59:00Z\\\",\\\"assay\\\":\\\"cytometry\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":133.4,\\\"collected_on\\\":\\\"2026-03-10\\\",\\\"batch\\\":\\\"B-3709\\\",\\\"hazardous\\\":false,\\\"owner\\\":{\\\"name\\\":\\\"Ines Varga\\\",\\\"email\\\":\\\"amara.okoye@corp.test\\\"}},{\\\"id\\\":\\\"SMP-21597\\\",\\\"created_at\\\":\\\"2026-01-05T16:15:00Z\\\",\\\"assay\\\":\\\"pcr\\\",\\\"lab\\\":\\\"north\\\",\\\"volume_ul\\\":802.4,\\\"collected_on\\\":\\\"2026-03-25\\\",\\\"batch\\\":\\\"B-3983\\\",\\\"hazardous\\\":false,\\\"owner\\\":{\\\"name\\\":\\\"Tom","results":{"c3a":[41.2,0.0,27.5,0.0,41.2,41.2,41.2],"c3b":[41.2,41.2,58.8,41.2,58.8,82.4,41.2]},"fails":{"c3a":[1,1,1,1,1,1,1],"c3b":[1,1,1,1,1,1,1]}},{"id":"v3_partial_35_epoch+nest+refresh_rotation_shipments","suite":"heal_v3_hint","tier":"B","title":"Brora Shipments API","goal":"# Brora Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.brora.net/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:shipments","base_path","noise","envelope","login_format:form","case:heal3","mutation:add_drift_epoch","mutation:add_drift_nest","mutation:add_refresh_rotation"],"n_requests":13,"requests":[["GET","https://api.brora.net/config.json",200,"application/json"],["GET","https://api.brora.net/favicon.ico",200,"image/x-icon"],["POST","https://api.brora.net/v1/auth/login",200,"application/json"],["GET","https://api.brora.net/v1/records",200,"application/json"],["GET","https://api.brora.net/v1/records?p=2",200,"application/json"],["GET","https://api.brora.net/v1/records",200,"application/json"],["GET","https://api.brora.net/v1/records?p=2",200,"application/json"],["GET","https://api.brora.net/static/js/main.4419aed2.js",200,"application/javascript"],["GET","https://api.brora.net/v1/records",401,"application/json"],["POST","https://api.brora.net/v1/sessions/refresh",200,"application/json"],["GET","https://api.brora.net/v1/records",200,"application/json"],["GET","https://api.brora.net/v1/records?p=2",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.brora.net/config.json\",\n \"headers\": {\n \"host\": \"api.brora.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.brora.net\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.brora.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"e9e32811\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}","results":{"c3a":[58.8,58.8,45.1,0.0,0.0,58.8,17.6],"c3b":[100.0,100.0,100.0,0.0,0.0,0.0,17.6]},"fails":{"c3a":[11,11,11,0,0,11,6],"c3b":[-1,-1,-1,0,0,0,6]}},{"id":"v3_partial_36_enum+rate_limit+moved_tickets","suite":"heal_v3_hint","tier":"B","title":"Keslo Tickets API","goal":"# Keslo Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.keslo.com/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:tickets","base_path","noise","token_expiry","etag_update","login_format:form","csrf_in:header","case:heal3","mutation:add_drift_enum","mutation:add_rate_limit","mutation:add_moved"],"n_requests":7,"requests":[["POST","https://api.keslo.com/v1/auth/login",200,"application/json"],["GET","https://api.keslo.com/v1/records",200,"application/json"],["GET","https://api.keslo.com/v1/records?offset=10",200,"application/json"],["GET","https://api.keslo.com/static/js/main.86b84b05.js",200,"application/javascript"],["GET","https://api.keslo.com/v1/entities/records/TCK-21564",429,"application/json"],["GET","https://api.keslo.com/v1/entities/records/TCK-21564",200,"application/json"],["POST","https://o384308270.ingest.sentry.io/api/384308270/envelope/?sentry_key=31cd212c0aae6addc52b2897",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.keslo.com/v1/auth/login\",\n \"headers\": {\n \"host\": \"api.keslo.com\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.keslo.com\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.keslo.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_1aee5b15\\\"}\"\n }\n }\n}","results":{"c3a":[0.0,17.6,11.8,0.0,0.0,0.0,0.0],"c3b":[0.0,0.0,0.0,0.0,0.0,0.0,0.0]},"fails":{"c3a":[10,2,10,10,10,10,10],"c3b":[10,10,10,10,10,10,10]}},{"id":"v3_partial_37_rename+cents+idempotency_key_bookings","suite":"heal_v3_hint","tier":"B","title":"Havdex Bookings API","goal":"# Havdex Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havdex.co/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:bookings","base_path","noise","hidden_header","envelope","case:heal3","mutation:add_drift_rename","mutation:add_drift_cents","mutation:add_idempotency_key"],"n_requests":4,"requests":[["GET","https://api.havdex.co/v2/items",200,"application/json"],["GET","https://api.havdex.co/v2/items?cursor=OTY4YjgzYWM6MTA",200,"application/json"],["POST","https://api.havdex.co/v2/items",201,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.havdex.co/v2/items\",\n \"headers\": {\n \"host\": \"api.havdex.co\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-1.8\",\n \"x-api-key\": \"sk_f42102d685e756166922dd21\",\n \"origin\": \"https://app.havdex.co\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havdex.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"BKG-50306\\\",\\\"created_at\\\":\\\"2026-01-05T10:35:00Z\\\",\\\"guest_name\\\":\\\"Ravi Menon\\\",\\\"room\\\":\\\"Ember\\\",\\\"starts_on\\\":\\\"2026-12-17\\\",\\\"nights\\\":4,\\\"party_size\\\":7,\\\"confirmed\\\":true,\\\"total_cents\\\":77741},{\\\"id\\\":\\\"BKG-96445\\\",\\\"created_at\\\":\\\"2026-01-05T12:30:00Z\\\",\\\"guest_name\\\":\\\"Tomas Ito\\\",\\\"room\\\":\\\"Birch\\\",\\\"starts_on\\\":\\\"2026-11-06\\\",\\\"nights\\\":14,\\\"party_size\\\":8,\\\"confirmed\\\":true,\\\"total_cents\\\":61327},{\\\"id\\\":\\\"BKG-52416\\\",\\\"created_at\\\":\\\"2026-01-05T13:40:00Z\\\",\\\"guest_name\\\":\\\"Elin Berg\\\",\\\"room\\\":\\\"Birch\\\",\\\"starts_on\\\":\\\"2026-11-24\\\",\\\"nights\\\":9,\\\"party_size\\\":4,\\\"confirmed\\\":false,\\\"total_cents\\\":42636},{\\\"id\\\":\\\"BKG-40331\\\",\\\"created_at\\\":\\\"2026-01-05T15:12:00Z\\\",\\\"guest_name\\\":\\\"Ines Varga\\\",\\\"room\\\":\\\"Aurora\\\",\\\"starts_on\\\":\\\"2026-0","results":{"c3a":[41.2,17.6,25.5,0.0,0.0,41.2,41.2],"c3b":[0.0,41.2,58.8,41.2,0.0,0.0,41.2]},"fails":{"c3a":[1,6,1,1,1,1,1],"c3b":[1,1,1,1,1,1,1]}},{"id":"v3_partial_38_nest+refresh_rotation+idempotency_key_samples","suite":"heal_v3_hint","tier":"B","title":"Pelora Samples API","goal":"# Pelora Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pelora.net/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:samples","base_path","noise","envelope","login_format:form","case:heal3","mutation:add_drift_nest","mutation:add_refresh_rotation","mutation:add_idempotency_key"],"n_requests":11,"requests":[["POST","https://api.pelora.net/api/auth/token",200,"application/json"],["GET","https://api.pelora.net/api/items",200,"application/json"],["GET","https://api.pelora.net/api/items?after=YjY4ZjUwYWU6MTA",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.pelora.net/api/items",201,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.pelora.net/api/items",200,"application/json"],["GET","https://api.pelora.net/api/items?after=YjY4ZjUwYWU6MTA",401,"application/json"],["POST","https://api.pelora.net/api/token/refresh",200,"application/json"],["GET","https://api.pelora.net/api/items?after=YjY4ZjUwYWU6MTA",200,"application/json"],["POST","https://o253655190.ingest.sentry.io/api/253655190/envelope/?sentry_key=00fa9e603c602ba5477bbfc5",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.pelora.net/api/auth/token\",\n \"headers\": {\n \"host\": \"api.pelora.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.pelora.net\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pelora.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"jwt\\\":\\\"tok_69601773eeb4949d2fe74267\\\",\\\"refresh_token\\\":\\\"rtk_7926103fb6b0d19147c5c34f\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c3b":[0.0,0.0,0.0,0.0,0.0,0.0,0.0]},"fails":{"c3a":[1,1,1,1,1,1,1],"c3b":[1,1,1,1,1,1,1]}},{"id":"v3_partial_39_epoch+enum+moved_invoices","suite":"heal_v3_hint","tier":"B","title":"Traly Invoices API","goal":"# Traly Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.traly.io/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:invoices","base_path","noise","etag_update","envelope","login_format:form","csrf_in:json","case:heal3","mutation:add_drift_epoch","mutation:add_drift_enum","mutation:add_moved"],"n_requests":6,"requests":[["GET","https://api.traly.io/robots.txt",200,"text/plain"],["POST","https://api.traly.io/v3/login",200,"application/json"],["GET","https://api.traly.io/v3/records",200,"application/json"],["GET","https://api.traly.io/v3/records?offset=10",200,"application/json"],["GET","https://api.traly.io/v3/entities/records/INV-35620",200,"application/json"],["GET","https://api.traly.io/static/css/main.e0f6439b.css",200,"text/css"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.traly.io/v3/login\",\n \"headers\": {\n \"host\": \"api.traly.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.traly.io\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.traly.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_664929e8\\\",\\\"csrf_token\\\":\\\"732c5c7eb23659c2\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,45.1,58.8,17.6,58.8,17.6],"c3b":[82.4,100.0,66.7,100.0,17.6,17.6,41.2]},"fails":{"c3a":[1,1,1,1,12,1,1],"c3b":[2,-1,7,-1,6,1,4]}},{"id":"v3_release3_14_cents+rate_limit+refresh_rotation_shipments","suite":"heal_v3_hint","tier":"B","title":"Velly Shipments API","goal":"# Velly Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.velly.io/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:shipments","base_path","noise","etag_update","envelope","login_format:json","case:heal3","mutation:add_drift_cents","mutation:add_rate_limit","mutation:add_refresh_rotation"],"n_requests":14,"requests":[["POST","https://o123098785.ingest.sentry.io/api/123098785/envelope/?sentry_key=dd5f62b399b23c4971650d76",200,"application/json"],["POST","https://api.velly.io/api/sessions",200,"application/json"],["GET","https://api.velly.io/api/records",200,"application/json"],["GET","https://api.velly.io/ping",200,"application/json"],["GET","https://api.velly.io/api/records/SHP-47648",200,"application/json"],["POST","https://api.velly.io/api/records",201,"application/json"],["POST","https://o165592550.ingest.sentry.io/api/165592550/envelope/?sentry_key=d4b355fa72a028ac82697baf",200,"application/json"],["GET","https://api.velly.io/static/js/main.d313e12f.js",200,"application/javascript"],["GET","https://api.velly.io/api/records/SHP-38871",200,"application/json"],["PATCH","https://api.velly.io/api/records/SHP-38871",429,"application/json"],["PATCH","https://api.velly.io/api/records/SHP-38871",401,"application/json"],["POST","https://api.velly.io/api/auth/refresh",200,"application/json"],["PATCH","https://api.velly.io/api/records/SHP-38871",200,"application/json"],["DELETE","https://api.velly.io/api/records/SHP-46492",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o123098785.ingest.sentry.io/api/123098785/envelope/?sentry_key=dd5f62b399b23c4971650d76\",\n \"headers\": {\n \"host\": \"o123098785.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.velly.io\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.velly.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"9551cb031819af3fce78d1d7\\\"}\"\n }\n }\n}","results":{"c3a":[11.8,11.8,3.9,23.5,23.5,23.5,23.5],"c3b":[0.0,11.8,88.2,23.5,0.0,23.5,23.5]},"fails":{"c3a":[6,6,6,10,10,10,10],"c3b":[6,6,10,10,2,10,10]}},{"id":"v3_release3_15_epoch+enum+idempotency_key_shipments","suite":"heal_v3_hint","tier":"B","title":"Pelton Shipments API","goal":"# Pelton Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pelton.io/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:none","domain:shipments","base_path","noise","etag_update","hidden_header","case:heal3","mutation:add_drift_epoch","mutation:add_drift_enum","mutation:add_idempotency_key"],"n_requests":9,"requests":[["GET","https://api.pelton.io/api/shipments",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=261353514&fmt=gif",204,"image/gif"],["GET","https://api.pelton.io/api/shipments/SHP-55873",200,"application/json"],["POST","https://api.pelton.io/api/shipments",201,"application/json"],["GET","https://api.pelton.io/api/shipments/SHP-20652",200,"application/json"],["PATCH","https://api.pelton.io/api/shipments/SHP-20652",200,"application/json"],["DELETE","https://api.pelton.io/api/shipments/SHP-10612",204,"x-unknown"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-463307581&cid=463307581.463307581&en=page_view",204,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.pelton.io/api/shipments\",\n \"headers\": {\n \"host\": \"api.pelton.io\",\n \"connection\": \"keep-alive\",\n \"x-app-build\": \"1457\",\n \"api-key\": \"sk_164f2cdad539330cbe806ce0\",\n \"origin\": \"https://app.pelton.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pelton.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"[{\\\"id\\\":\\\"SHP-28727\\\",\\\"created_at\\\":1767636000,\\\"carrier\\\":\\\"Northwind Freight\\\",\\\"status\\\":\\\"RETURNED\\\",\\\"origin\\\":\\\"Valparaiso\\\",\\\"destination\\\":\\\"Quito\\\",\\\"weight_kg\\\":325.4,\\\"fragile\\\":true,\\\"eta_days\\\":4},{\\\"id\\\":\\\"SHP-10612\\\",\\\"created_at\\\":1767637500,\\\"carrier\\\":\\\"Tidewater Express\\\",\\\"status\\\":\\\"PENDING\\\",\\\"origin\\\":\\\"Tallinn\\\",\\\"destination\\\":\\\"Valparaiso\\\",\\\"weight_kg\\\":323.3,\\\"fragile\\\":true,\\\"eta_days\\\":6},{\\\"id\\\":\\\"SHP-58893\\\",\\\"created_at\\\":1767639060,\\\"carrier\\\":\\\"Northwind Freight\\\",\\\"status\\\":\\\"RETURNED\\\",\\\"origin\\\":\\\"Tallinn\\\",\\\"destination\\\":\\\"Ghent\\\",\\\"weight_kg\\\":12.8,\\\"fragile\\\":false,\\\"eta_days\\\":4},{\\\"id\\\":\\\"SHP-66159\\\",\\\"created_at\\\":1767642240,\\\"carrier\\\":\\\"Tidewater Express\\\",\\\"status\\\":\\\"RETURNED\\\",\\\"origin\\\":\\\"Nairobi\\\",\\\"destination\\\":\\\"L","results":{"c3a":[17.6,0.0,27.5,47.1,47.1,47.1,17.6],"c3b":[0.0,41.2,72.5,41.2,17.6,41.2,17.6]},"fails":{"c3a":[1,1,1,1,1,1,1],"c3b":[1,1,1,1,1,1,1]}},{"id":"v3_release3_16_nest+async_create+moved_bookings","suite":"heal_v3_hint","tier":"B","title":"Fenton Bookings API","goal":"# Fenton Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.fenton.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:bookings","base_path","noise","token_expiry","etag_update","login_format:json","csrf_in:json","case:heal3","mutation:add_drift_nest","mutation:add_async_create","mutation:add_moved"],"n_requests":21,"requests":[["POST","https://o305368798.ingest.sentry.io/api/305368798/envelope/?sentry_key=72ffeb2e4c82a8dfbff30876",200,"application/json"],["POST","https://api.fenton.dev/v2/login",200,"application/json"],["GET","https://api.fenton.dev/v2/records",200,"application/json"],["GET","https://api.fenton.dev/v2/records?offset=10",200,"application/json"],["POST","https://o712346893.ingest.sentry.io/api/712346893/envelope/?sentry_key=d35fe540c34f1091c07a2845",200,"application/json"],["GET","https://api.fenton.dev/v2/data/records/BKG-95092",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://api.fenton.dev/v2/records",202,"application/json"],["GET","https://api.fenton.dev/v2/operations/job_321dfcf8cde9",401,"application/json"],["POST","https://api.fenton.dev/v2/login",200,"application/json"],["GET","https://api.fenton.dev/v2/operations/job_321dfcf8cde9",200,"application/json"],["GET","https://api.fenton.dev/v2/operations/job_321dfcf8cde9",200,"application/json"],["GET","https://api.fenton.dev/v2/operations/job_321dfcf8cde9",200,"application/json"],["GET","https://api.fenton.dev/",200,"text/html"],["GET","https://api.fenton.dev/v2/data/records/BKG-19608",200,"application/json"],["PATCH","https://api.fenton.dev/v2/data/records/BKG-19608",401,"application/json"],["POST","https://api.fenton.dev/v2/login",200,"application/json"],["PATCH","https://api.fenton.dev/v2/data/records/BKG-19608",200,"application/json"],["GET","https://api.fenton.dev/config.json",200,"application/json"],["DELETE","https://api.fenton.dev/v2/data/records/BKG-60157",204,"x-unknown"],["GET","https://api.fenton.dev/robots.txt",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o305368798.ingest.sentry.io/api/305368798/envelope/?sentry_key=72ffeb2e4c82a8dfbff30876\",\n \"headers\": {\n \"host\": \"o305368798.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.fenton.dev\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.fenton.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"22a4c7e1c13da6781526525e\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,58.8,17.6,17.6],"c3b":[64.7,100.0,100.0,64.7,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,6,11,6,6],"c3b":[2,-1,-1,4,-1,-1,-1]}},{"id":"v3_release3_17_rename+nest+idempotency_key_samples","suite":"heal_v3_hint","tier":"B","title":"Oriant Samples API","goal":"# Oriant Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.oriant.io/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:samples","base_path","noise","etag_update","envelope","case:heal3","mutation:add_drift_rename","mutation:add_drift_nest","mutation:add_idempotency_key"],"n_requests":10,"requests":[["GET","https://api.oriant.io/static/css/main.b1cf0fbc.css",200,"text/css"],["GET","https://api.oriant.io/v3/items",200,"application/json"],["GET","https://api.oriant.io/v3/items?after=NjQ2MjE1YTM6MTA",200,"application/json"],["GET","https://api.oriant.io/v3/items/SMP-26522",200,"application/json"],["POST","https://api.oriant.io/v3/items",201,"application/json"],["GET","https://api.oriant.io/static/css/main.51a36e32.css",200,"text/css"],["GET","https://api.oriant.io/v3/items/SMP-54933",200,"application/json"],["PATCH","https://api.oriant.io/v3/items/SMP-54933",200,"application/json"],["DELETE","https://api.oriant.io/v3/items/SMP-45330",204,"x-unknown"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-699691935&cid=699691935.699691935&en=page_view",204,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.oriant.io/v3/items\",\n \"headers\": {\n \"host\": \"api.oriant.io\",\n \"connection\": \"keep-alive\",\n \"api-key\": \"sk_5987aea11186d9d7eed043a7\",\n \"origin\": \"https://app.oriant.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.oriant.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"SMP-16075\\\",\\\"created_at\\\":\\\"2026-01-05T18:25:00Z\\\",\\\"assay\\\":\\\"cytometry\\\",\\\"lab\\\":\\\"harbor\\\",\\\"volume_ul\\\":783.2,\\\"sampled_on\\\":\\\"2026-02-17\\\",\\\"batch\\\":\\\"B-9112\\\",\\\"hazardous\\\":false,\\\"requester\\\":{\\\"name\\\":\\\"Sofia Duarte\\\",\\\"email\\\":\\\"lena.brandt@mail.test\\\"}},{\\\"id\\\":\\\"SMP-45330\\\",\\\"created_at\\\":\\\"2026-01-05T18:42:00Z\\\",\\\"assay\\\":\\\"elisa\\\",\\\"lab\\\":\\\"harbor\\\",\\\"volume_ul\\\":167.8,\\\"sampled_on\\\":\\\"2026-03-20\\\",\\\"batch\\\":\\\"B-1957\\\",\\\"hazardous\\\":true,\\\"requester\\\":{\\\"name\\\":\\\"Tomas Ito\\\",\\\"email\\\":\\\"sofia.duarte@example.org\\\"}},{\\\"id\\\":\\\"SMP-63048\\\",\\\"created_at\\\":\\\"2026-01-05T19:37:00Z\\\",\\\"assay\\\":\\\"mass_spec\\\",\\\"lab\\\":\\\"harbor\\\",\\\"volume_ul\\\":513.1,\\\"sampled_on\\\":\\\"2026-06-04\\\",\\\"batch\\\":\\\"B-5085\\\",\\\"hazardous\\\":false,\\\"requester\\\":{\\\"name\\\":\\\"Marta Lindqvist\\\",\\\"email\\\":\\\"tomas.","results":{"c3a":[0.0,82.4,45.1,17.6,58.8,58.8,17.6],"c3b":[41.2,41.2,80.4,82.4,82.4,100.0,17.6]},"fails":{"c3a":[1,1,6,6,11,11,6],"c3b":[1,1,1,1,1,-1,6]}},{"id":"v3_release3_18_epoch+async_create+moved_invoices","suite":"heal_v3_hint","tier":"B","title":"Broton Invoices API","goal":"# Broton Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.broton.co/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:invoices","base_path","noise","etag_update","login_format:json","csrf_in:json","case:heal3","mutation:add_drift_epoch","mutation:add_async_create","mutation:add_moved"],"n_requests":16,"requests":[["POST","https://api.broton.co/api/login",200,"application/json"],["GET","https://api.broton.co/api/records",200,"application/json"],["GET","https://api.broton.co/api/records?after=ZjMxY2MxOGU6MTA",200,"application/json"],["GET","https://api.broton.co/static/css/main.e35171ac.css",200,"text/css"],["GET","https://api.broton.co/api/entities/records/INV-93317",200,"application/json"],["POST","https://api.broton.co/api/records",202,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.broton.co/manifest.json",200,"application/json"],["GET","https://api.broton.co/api/jobs/job_9af5f8a67d14",200,"application/json"],["GET","https://api.broton.co/api/jobs/job_9af5f8a67d14",200,"application/json"],["GET","https://api.broton.co/api/jobs/job_9af5f8a67d14",200,"application/json"],["GET","https://api.broton.co/api/entities/records/INV-63604",200,"application/json"],["PATCH","https://api.broton.co/api/entities/records/INV-63604",200,"application/json"],["DELETE","https://api.broton.co/api/entities/records/INV-94727",204,"x-unknown"],["GET","https://api.broton.co/sockjs-node/info",200,"application/json"],["GET","https://api.broton.co/",200,"text/html"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.broton.co/api/login\",\n \"headers\": {\n \"host\": \"api.broton.co\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.broton.co\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.broton.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_5a3eb7b5\\\",\\\"csrf_token\\\":\\\"ad1a3fcf9a8ad92a\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,100.0,17.6,100.0,17.6],"c3b":[100.0,100.0,66.7,17.6,17.6,17.6,100.0]},"fails":{"c3a":[6,6,6,-1,6,-1,6],"c3b":[-1,-1,7,6,6,6,-1]}},{"id":"v3_release3_19_rename+enum+refresh_rotation_tickets","suite":"heal_v3_hint","tier":"B","title":"Orilo Tickets API","goal":"# Orilo Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.orilo.io/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:tickets","base_path","noise","etag_update","login_format:json","case:heal3","mutation:add_drift_rename","mutation:add_drift_enum","mutation:add_refresh_rotation"],"n_requests":14,"requests":[["GET","https://api.orilo.io/__flags",200,"application/json"],["POST","https://api.orilo.io/api/auth/token",200,"application/json"],["GET","https://api.orilo.io/api/records",200,"application/json"],["GET","https://api.orilo.io/api/records?p=2",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.orilo.io/api/records/TCK-26398",200,"application/json"],["POST","https://api.orilo.io/api/records",201,"application/json"],["GET","https://api.orilo.io/api/records/TCK-10545",401,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.orilo.io/api/token/refresh",200,"application/json"],["GET","https://api.orilo.io/api/records/TCK-10545",200,"application/json"],["PATCH","https://api.orilo.io/api/records/TCK-10545",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["DELETE","https://api.orilo.io/api/records/TCK-99949",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.orilo.io/__flags\",\n \"headers\": {\n \"host\": \"api.orilo.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.orilo.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.orilo.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"127f9939\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,0.0,47.1,70.6,17.6],"c3b":[17.6,100.0,100.0,0.0,0.0,17.6,17.6]},"fails":{"c3a":[1,1,1,0,1,1,1],"c3b":[6,-1,-1,0,0,1,1]}},{"id":"v3_release3_20_cents+rate_limit+moved_samples","suite":"heal_v3_hint","tier":"B","title":"Daxdex Samples API","goal":"# Daxdex Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.daxdex.dev/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:samples","base_path","noise","hidden_header","envelope","login_format:json","csrf_in:json","case:heal3","mutation:add_drift_cents","mutation:add_rate_limit","mutation:add_moved"],"n_requests":11,"requests":[["POST","https://api.daxdex.dev/api/login",200,"application/json"],["GET","https://api.daxdex.dev/api/items",200,"application/json"],["GET","https://api.daxdex.dev/api/items?cursor=OTc5YWNhMzU6MTA",200,"application/json"],["POST","https://o941069209.ingest.sentry.io/api/941069209/envelope/?sentry_key=74ca0069203265f90e8a0ca6",200,"application/json"],["GET","https://api.daxdex.dev/api/rest/items/SMP-80810",200,"application/json"],["POST","https://api.daxdex.dev/api/items",201,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-836867195&cid=836867195.836867195&en=page_view",204,"text/plain"],["PATCH","https://api.daxdex.dev/api/rest/items/SMP-62519",429,"application/json"],["PATCH","https://api.daxdex.dev/api/rest/items/SMP-62519",200,"application/json"],["DELETE","https://api.daxdex.dev/api/rest/items/SMP-27091",204,"x-unknown"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-818431058&cid=818431058.818431058&en=page_view",204,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.daxdex.dev/api/login\",\n \"headers\": {\n \"host\": \"api.daxdex.dev\",\n \"connection\": \"keep-alive\",\n \"x-app-build\": \"6378\",\n \"origin\": \"https://app.daxdex.dev\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.daxdex.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_ce7c3cff\\\",\\\"csrf_token\\\":\\\"78f86399748e3d4c\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,5.9,17.6,58.8,0.0],"c3b":[100.0,100.0,100.0,5.9,5.9,100.0,5.9]},"fails":{"c3a":[6,6,6,10,6,11,10],"c3b":[-1,-1,-1,10,10,-1,10]}},{"id":"v3_release3_21_nest+enum+async_create_tickets","suite":"heal_v3_hint","tier":"B","title":"Quoly Tickets API","goal":"# Quoly Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quoly.io/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:tickets","base_path","noise","etag_update","case:heal3","mutation:add_drift_nest","mutation:add_drift_enum","mutation:add_async_create"],"n_requests":13,"requests":[["GET","https://api.quoly.io/manifest.json",200,"application/json"],["GET","https://api.quoly.io/v2/items",200,"application/json"],["GET","https://api.quoly.io/v2/items?start=10",200,"application/json"],["GET","https://api.quoly.io/v2/items/TCK-48544",200,"application/json"],["POST","https://api.quoly.io/v2/items",202,"application/json"],["GET","https://api.quoly.io/v2/jobs/job_b0c5ac171458",200,"application/json"],["GET","https://api.quoly.io/v2/jobs/job_b0c5ac171458",200,"application/json"],["GET","https://api.quoly.io/v2/items/TCK-39436",200,"application/json"],["PATCH","https://api.quoly.io/v2/items/TCK-39436",200,"application/json"],["GET","https://api.quoly.io/",200,"text/html"],["DELETE","https://api.quoly.io/v2/items/TCK-57950",204,"x-unknown"],["GET","https://api.quoly.io/config.json",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.quoly.io/manifest.json\",\n \"headers\": {\n \"host\": \"api.quoly.io\",\n \"connection\": \"keep-alive\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"manifest\",\n \"referer\": \"https://app.quoly.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"short_name\\\":\\\"App\\\",\\\"start_url\\\":\\\".\\\",\\\"display\\\":\\\"standalone\\\",\\\"icons\\\":[]}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,45.1,17.6,17.6,100.0,17.6],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,6,6,-1,6]}},{"id":"v3_release3_22_rename+rate_limit+idempotency_key_bookings","suite":"heal_v3_hint","tier":"B","title":"Pelra Bookings API","goal":"# Pelra Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pelra.net/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:bookings","base_path","noise","token_expiry","etag_update","envelope","login_format:json","csrf_in:json","case:heal3","mutation:add_drift_rename","mutation:add_rate_limit","mutation:add_idempotency_key"],"n_requests":16,"requests":[["GET","https://api.pelra.net/static/media/logo.3ad8ef07.svg",200,"image/svg+xml"],["POST","https://api.pelra.net/v3/sessions",200,"application/json"],["GET","https://api.pelra.net/v3/bookings",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-630751493&cid=630751493.630751493&en=page_view",204,"text/plain"],["GET","https://api.pelra.net/v3/bookings/BKG-64899",200,"application/json"],["POST","https://api.pelra.net/v3/bookings",429,"application/json"],["POST","https://api.pelra.net/v3/bookings",201,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.pelra.net/sockjs-node/info",200,"application/json"],["GET","https://api.pelra.net/v3/bookings/BKG-50614",200,"application/json"],["PATCH","https://api.pelra.net/v3/bookings/BKG-50614",401,"application/json"],["POST","https://api.pelra.net/v3/sessions",429,"application/json"],["POST","https://api.pelra.net/v3/sessions",200,"application/json"],["PATCH","https://api.pelra.net/v3/bookings/BKG-50614",200,"application/json"],["DELETE","https://api.pelra.net/v3/bookings/BKG-88118",204,"x-unknown"],["GET","https://api.pelra.net/",200,"text/html"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.pelra.net/v3/sessions\",\n \"headers\": {\n \"host\": \"api.pelra.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.pelra.net\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pelra.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_96b78537\\\",\\\"csrf_token\\\":\\\"38b8628339acafdb\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[0.0,23.5,17.6,23.5,11.8,35.3,0.0],"c3b":[23.5,41.2,74.5,0.0,0.0,0.0,0.0]},"fails":{"c3a":[10,10,6,1,10,1,10],"c3b":[10,1,10,10,10,10,10]}},{"id":"v3_release3_23_cents+epoch+refresh_rotation_invoices","suite":"heal_v3_hint","tier":"B","title":"Torrix Invoices API","goal":"# Torrix Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.torrix.io/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:invoices","base_path","noise","hidden_header","envelope","login_format:form","case:heal3","mutation:add_drift_cents","mutation:add_drift_epoch","mutation:add_refresh_rotation"],"n_requests":11,"requests":[["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.torrix.io/api/auth/token",200,"application/json"],["GET","https://api.torrix.io/api/items",200,"application/json"],["GET","https://api.torrix.io/api/items/INV-91099",200,"application/json"],["POST","https://api.torrix.io/api/items",201,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://o980663142.ingest.sentry.io/api/980663142/envelope/?sentry_key=50596d1b202bf9d475f8f24c",200,"application/json"],["PATCH","https://api.torrix.io/api/items/INV-77772",200,"application/json"],["DELETE","https://api.torrix.io/api/items/INV-66989",401,"application/json"],["POST","https://api.torrix.io/api/sessions/refresh",200,"application/json"],["DELETE","https://api.torrix.io/api/items/INV-66989",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.torrix.io/api/auth/token\",\n \"headers\": {\n \"host\": \"api.torrix.io\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-1.5\",\n \"origin\": \"https://app.torrix.io\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.torrix.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"access_token\\\":\\\"tok_d6f2cee8822480beecc88d09\\\",\\\"refresh\\\":\\\"rtk_ce927d2d737e18c8f7863177\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,35.3,58.8,17.6],"c3b":[100.0,100.0,100.0,100.0,17.6,17.6,17.6]},"fails":{"c3a":[6,6,6,6,3,11,6],"c3b":[-1,-1,-1,-1,6,6,6]}},{"id":"v3_release4_24_epoch+nest+async_create+moved_shipments","suite":"heal_v3_hint","tier":"B","title":"Pello Shipments API","goal":"# Pello Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pello.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:link_header","domain:shipments","base_path","noise","hidden_header","envelope","case:heal3","mutation:add_drift_epoch","mutation:add_drift_nest","mutation:add_async_create","mutation:add_moved"],"n_requests":13,"requests":[["GET","https://api.pello.dev/static/media/logo.e1aecc66.svg",200,"image/svg+xml"],["GET","https://api.pello.dev/v2/items",200,"application/json"],["GET","https://api.pello.dev/v2/items?p=2",200,"application/json"],["GET","https://api.pello.dev/v2/entities/items/SHP-35759",200,"application/json"],["GET","https://api.pello.dev/",200,"text/html"],["POST","https://api.pello.dev/v2/items",202,"application/json"],["GET","https://api.pello.dev/config.json",200,"application/json"],["GET","https://api.pello.dev/v2/tasks/job_9b22167bfa3f",200,"application/json"],["GET","https://api.pello.dev/v2/tasks/job_9b22167bfa3f",200,"application/json"],["GET","https://api.pello.dev/v2/tasks/job_9b22167bfa3f",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["PATCH","https://api.pello.dev/v2/entities/items/SHP-41303",200,"application/json"],["DELETE","https://api.pello.dev/v2/entities/items/SHP-68880",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.pello.dev/v2/items\",\n \"headers\": {\n \"host\": \"api.pello.dev\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-06-11\",\n \"x-api-token\": \"sk_9037e2f4dec3dce988801f0f\",\n \"origin\": \"https://app.pello.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pello.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"SHP-57022\\\",\\\"created_at\\\":1767632520,\\\"carrier\\\":\\\"Tidewater Express\\\",\\\"status\\\":\\\"delivered\\\",\\\"origin\\\":\\\"Mumbai\\\",\\\"destination\\\":\\\"Osaka\\\",\\\"weight_kg\\\":302.4,\\\"fragile\\\":true,\\\"eta_days\\\":17,\\\"contact\\\":{\\\"name\\\":\\\"Marta Lindqvist\\\",\\\"email\\\":\\\"elin.berg@corp.test\\\"}},{\\\"id\\\":\\\"SHP-97963\\\",\\\"created_at\\\":1767633660,\\\"carrier\\\":\\\"Kestrel Lines\\\",\\\"status\\\":\\\"delivered\\\",\\\"origin\\\":\\\"Hanoi\\\",\\\"destination\\\":\\\"Lisbon\\\",\\\"weight_kg\\\":354.8,\\\"fragile\\\":true,\\\"eta_days\\\":13,\\\"contact\\\":{\\\"name\\\":\\\"Sofia Duarte\\\",\\\"email\\\":\\\"kofi.mensah@example.org\\\"}},{\\\"id\\\":\\\"SHP-92775\\\",\\\"created_at\\\":1767640320,\\\"carrier\\\":\\\"Northwind Freight\\\",\\\"status\\\":\\\"delivered\\\",\\\"origin\\\":\\\"Perth\\\",\\\"destination\\\":\\\"Nairobi\\\",\\\"weight_kg\\\":260.5,\\\"fragile\\\":true,","results":{"c3a":[17.6,0.0,31.4,0.0,0.0,0.0,58.8],"c3b":[100.0,100.0,72.5,17.6,17.6,82.4,17.6]},"fails":{"c3a":[2,0,6,2,3,2,11],"c3b":[-1,-1,6,6,6,2,6]}},{"id":"v3_release4_25_cents+rate_limit+refresh_rotation+idempotency_key_samples","suite":"heal_v3_hint","tier":"B","title":"Velant Samples API","goal":"# Velant Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.velant.com/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:samples","base_path","noise","etag_update","hidden_header","envelope","login_format:form","case:heal3","mutation:add_drift_cents","mutation:add_rate_limit","mutation:add_refresh_rotation","mutation:add_idempotency_key"],"n_requests":14,"requests":[["GET","https://api.velant.com/static/media/logo.323b10df.svg",200,"image/svg+xml"],["POST","https://api.velant.com/v3/auth/login",200,"application/json"],["GET","https://api.velant.com/v3/items",200,"application/json"],["GET","https://api.velant.com/v3/items/SMP-49272",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-119386489",200,"application/javascript"],["POST","https://api.velant.com/v3/items",201,"application/json"],["GET","https://api.velant.com/v3/items/SMP-33180",401,"application/json"],["POST","https://api.velant.com/v3/sessions/refresh",429,"application/json"],["POST","https://api.velant.com/v3/sessions/refresh",200,"application/json"],["GET","https://api.velant.com/v3/items/SMP-33180",200,"application/json"],["PATCH","https://api.velant.com/v3/items/SMP-33180",200,"application/json"],["DELETE","https://api.velant.com/v3/items/SMP-38123",204,"x-unknown"],["GET","https://api.velant.com/config.json",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/8af920a42410ab305a581eb3.woff2",200,"font/woff2"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.velant.com/v3/auth/login\",\n \"headers\": {\n \"host\": \"api.velant.com\",\n \"connection\": \"keep-alive\",\n \"x-client-version\": \"2.14.1\",\n \"origin\": \"https://app.velant.com\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.velant.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"access_token\\\":\\\"tok_13cef880b0b43c1eea56c04d\\\",\\\"refresh_token\\\":\\\"rtk_9e26e9cb2d4038e02cf62aec\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,17.6,41.2,17.6],"c3b":[17.6,17.6,100.0,17.6,17.6,17.6,0.0]},"fails":{"c3a":[6,6,6,10,10,1,10],"c3b":[10,10,-1,10,10,10,10]}},{"id":"v3_release4_26_rename+cents+enum+async_create_tickets","suite":"heal_v3_hint","tier":"B","title":"Lumant Tickets API","goal":"# Lumant Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.lumant.net/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:tickets","base_path","noise","etag_update","hidden_header","envelope","login_format:json","csrf_in:header","case:heal3","mutation:add_drift_rename","mutation:add_drift_cents","mutation:add_drift_enum","mutation:add_async_create"],"n_requests":14,"requests":[["POST","https://api.lumant.net/v2/login",200,"application/json"],["GET","https://api.lumant.net/v2/tickets",200,"application/json"],["GET","https://api.lumant.net/v2/tickets/TCK-62801",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.lumant.net/v2/tickets",202,"application/json"],["GET","https://api.lumant.net/v2/jobs/job_a9ca0dca8c2f",200,"application/json"],["GET","https://api.lumant.net/v2/jobs/job_a9ca0dca8c2f",200,"application/json"],["GET","https://api.lumant.net/v2/jobs/job_a9ca0dca8c2f",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.lumant.net/v2/tickets/TCK-96619",200,"application/json"],["PATCH","https://api.lumant.net/v2/tickets/TCK-96619",200,"application/json"],["GET","https://api.lumant.net/__flags",200,"application/json"],["DELETE","https://api.lumant.net/v2/tickets/TCK-82270",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.lumant.net/v2/login\",\n \"headers\": {\n \"host\": \"api.lumant.net\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-1.5\",\n \"origin\": \"https://app.lumant.net\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.lumant.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_d4c33c44\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,45.1,0.0,100.0,88.2,0.0],"c3b":[100.0,100.0,100.0,17.6,17.6,100.0,17.6]},"fails":{"c3a":[1,6,6,3,-1,9,4],"c3b":[-1,-1,-1,6,6,-1,6]}},{"id":"v3_release4_27_nest+enum+rate_limit+refresh_rotation_bookings","suite":"heal_v3_hint","tier":"B","title":"Mirlo Bookings API","goal":"# Mirlo Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.mirlo.app/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:bookings","base_path","noise","etag_update","login_format:json","case:heal3","mutation:add_drift_nest","mutation:add_drift_enum","mutation:add_rate_limit","mutation:add_refresh_rotation"],"n_requests":14,"requests":[["POST","https://api.mirlo.app/v2/sessions",200,"application/json"],["GET","https://api.mirlo.app/__flags",200,"application/json"],["GET","https://api.mirlo.app/v2/bookings",200,"application/json"],["GET","https://api.mirlo.app/v2/bookings/BKG-43198",200,"application/json"],["POST","https://api.mirlo.app/v2/bookings",201,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.mirlo.app/static/media/logo.b6e3c6b1.svg",200,"image/svg+xml"],["GET","https://api.mirlo.app/v2/bookings/BKG-98358",401,"application/json"],["POST","https://api.mirlo.app/v2/auth/refresh",429,"application/json"],["POST","https://api.mirlo.app/v2/auth/refresh",200,"application/json"],["GET","https://api.mirlo.app/v2/bookings/BKG-98358",200,"application/json"],["PATCH","https://api.mirlo.app/v2/bookings/BKG-98358",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["DELETE","https://api.mirlo.app/v2/bookings/BKG-69151",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.mirlo.app/v2/sessions\",\n \"headers\": {\n \"host\": \"api.mirlo.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.mirlo.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.mirlo.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"jwt\\\":\\\"tok_c62a3056cd492c3b28a90764\\\",\\\"refresh_token\\\":\\\"rtk_1b1c403d431048cd8a1e06a6\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[0.0,58.8,72.5,17.6,0.0,100.0,0.0],"c3b":[100.0,17.6,72.5,0.0,17.6,100.0,5.9]},"fails":{"c3a":[10,1,1,10,10,-1,10],"c3b":[-1,10,10,2,10,-1,10]}},{"id":"v3_release4_28_epoch+async_create+idempotency_key+moved_invoices","suite":"heal_v3_hint","tier":"B","title":"Havrix Invoices API","goal":"# Havrix Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havrix.dev/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:invoices","base_path","noise","case:heal3","mutation:add_drift_epoch","mutation:add_async_create","mutation:add_idempotency_key","mutation:add_moved"],"n_requests":11,"requests":[["GET","https://cdn.segment.com/analytics.js/v1/49c63c2e1bab68e27ec1c552/analytics.min.js",200,"application/javascript"],["GET","https://api.havrix.dev/v3/items",200,"application/json"],["GET","https://api.havrix.dev/v3/items?start=10",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-115286322.js?sv=6",200,"application/javascript"],["GET","https://api.havrix.dev/v3/rest/items/INV-71283",200,"application/json"],["POST","https://api.havrix.dev/v3/items",202,"application/json"],["GET","https://api.havrix.dev/v3/tasks/job_9d2da3e5ecdb",200,"application/json"],["POST","https://o678147586.ingest.sentry.io/api/678147586/envelope/?sentry_key=3b903e8ea8e7f3f8180878f8",200,"application/json"],["GET","https://api.havrix.dev/v3/tasks/job_9d2da3e5ecdb",200,"application/json"],["PATCH","https://api.havrix.dev/v3/rest/items/INV-42761",200,"application/json"],["DELETE","https://api.havrix.dev/v3/rest/items/INV-17093",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.havrix.dev/v3/items\",\n \"headers\": {\n \"host\": \"api.havrix.dev\",\n \"connection\": \"keep-alive\",\n \"x-api-token\": \"sk_696fad69bfd57ea599b4058c\",\n \"origin\": \"https://app.havrix.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havrix.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"results\\\":[{\\\"id\\\":\\\"INV-31405\\\",\\\"created_at\\\":1767609240,\\\"customer\\\":\\\"Mosaic Freight\\\",\\\"state\\\":\\\"void\\\",\\\"amount_cents\\\":160481,\\\"currency\\\":\\\"EUR\\\",\\\"due_date\\\":\\\"2026-07-01\\\",\\\"memo\\\":\\\"Export fails for archived projects\\\"},{\\\"id\\\":\\\"INV-42636\\\",\\\"created_at\\\":1767612180,\\\"customer\\\":\\\"Mosaic Freight\\\",\\\"state\\\":\\\"void\\\",\\\"amount_cents\\\":98908,\\\"currency\\\":\\\"GBP\\\",\\\"due_date\\\":\\\"2026-08-15\\\",\\\"memo\\\":\\\"Webhook retries stop after day two\\\"},{\\\"id\\\":\\\"INV-81777\\\",\\\"created_at\\\":1767616140,\\\"customer\\\":\\\"Nimbus Dental\\\",\\\"state\\\":\\\"sent\\\",\\\"amount_cents\\\":907955,\\\"currency\\\":\\\"EUR\\\",\\\"due_date\\\":\\\"2026-05-06\\\",\\\"memo\\\":\\\"Export fails for archived projects\\\"},{\\\"id\\\":\\\"INV-31972\\\",\\\"created_at\\\":1767622740,\\\"customer\\\":\\\"Ostrava Tools\\\",\\\"state\\\":\\\"paid\\\",\\\"amount_cents\\\":842364,\\\"curr\"\n ","results":{"c3a":[0.0,17.6,17.6,100.0,100.0,100.0,0.0],"c3b":[41.2,41.2,100.0,82.4,100.0,41.2,17.6]},"fails":{"c3a":[1,6,6,-1,-1,-1,1],"c3b":[1,1,-1,1,-1,1,6]}},{"id":"v3_release4_29_rename+epoch+enum+moved_shipments","suite":"heal_v3_hint","tier":"B","title":"Havlo Shipments API","goal":"# Havlo Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havlo.dev/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:shipments","base_path","noise","hidden_header","envelope","login_format:form","csrf_in:json","case:heal3","mutation:add_drift_rename","mutation:add_drift_epoch","mutation:add_drift_enum","mutation:add_moved"],"n_requests":10,"requests":[["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://api.havlo.dev/v1/login",200,"application/json"],["GET","https://api.havlo.dev/v1/records",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-184044420",200,"application/javascript"],["GET","https://api.havlo.dev/v1/records?skip=10",200,"application/json"],["GET","https://api.havlo.dev/v1/entities/records/SHP-50102",200,"application/json"],["POST","https://api.havlo.dev/v1/records",201,"application/json"],["PATCH","https://api.havlo.dev/v1/entities/records/SHP-44443",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-483710280&cid=483710280.483710280&en=page_view",204,"text/plain"],["DELETE","https://api.havlo.dev/v1/entities/records/SHP-31138",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.havlo.dev/v1/login\",\n \"headers\": {\n \"host\": \"api.havlo.dev\",\n \"connection\": \"keep-alive\",\n \"x-client-version\": \"2.16.8\",\n \"origin\": \"https://app.havlo.dev\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havlo.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_6ca26d43\\\",\\\"csrf_token\\\":\\\"56805aad8725c94d\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,58.8,58.8,0.0],"c3b":[100.0,100.0,100.0,17.6,17.6,17.6,17.6]},"fails":{"c3a":[1,1,1,1,1,1,1],"c3b":[-1,-1,-1,1,6,1,6]}},{"id":"v3_release4_30_rename+cents+rate_limit+idempotency_key_bookings","suite":"heal_v3_hint","tier":"B","title":"Torra Bookings API","goal":"# Torra Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.torra.app/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:bookings","base_path","noise","etag_update","case:heal3","mutation:add_drift_rename","mutation:add_drift_cents","mutation:add_rate_limit","mutation:add_idempotency_key"],"n_requests":11,"requests":[["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.torra.app/api/items",200,"application/json"],["GET","https://api.torra.app/api/items?page_token=NDM4YmU5MWE6MTA",200,"application/json"],["GET","https://api.torra.app/api/items/BKG-82698",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.torra.app/api/items",201,"application/json"],["GET","https://api.torra.app/api/items/BKG-35893",200,"application/json"],["PATCH","https://api.torra.app/api/items/BKG-35893",429,"application/json"],["PATCH","https://api.torra.app/api/items/BKG-35893",200,"application/json"],["DELETE","https://api.torra.app/api/items/BKG-24795",204,"x-unknown"],["GET","https://api.torra.app/static/js/main.9748fdc8.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.torra.app/api/items\",\n \"headers\": {\n \"host\": \"api.torra.app\",\n \"connection\": \"keep-alive\",\n \"api-key\": \"sk_d52a78e7afff2f59a77bb8da\",\n \"origin\": \"https://app.torra.app\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.torra.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"records\\\":[{\\\"id\\\":\\\"BKG-87156\\\",\\\"created_at\\\":\\\"2026-01-05T13:23:00Z\\\",\\\"guest_name\\\":\\\"Marta Lindqvist\\\",\\\"room\\\":\\\"Ember\\\",\\\"starts_on\\\":\\\"2026-10-08\\\",\\\"nights\\\":12,\\\"party_size\\\":4,\\\"confirmed\\\":false,\\\"price_cents\\\":28106},{\\\"id\\\":\\\"BKG-38042\\\",\\\"created_at\\\":\\\"2026-01-05T14:13:00Z\\\",\\\"guest_name\\\":\\\"Amara Okoye\\\",\\\"room\\\":\\\"Aurora\\\",\\\"starts_on\\\":\\\"2026-08-21\\\",\\\"nights\\\":10,\\\"party_size\\\":1,\\\"confirmed\\\":false,\\\"price_cents\\\":45803},{\\\"id\\\":\\\"BKG-91295\\\",\\\"created_at\\\":\\\"2026-01-05T14:40:00Z\\\",\\\"guest_name\\\":\\\"Tomas Ito\\\",\\\"room\\\":\\\"Ember\\\",\\\"starts_on\\\":\\\"2026-01-04\\\",\\\"nights\\\":1,\\\"party_size\\\":1,\\\"confirmed\\\":false,\\\"price_cents\\\":35922},{\\\"id\\\":\\\"BKG-35893\\\",\\\"created_at\\\":\\\"2026-01-05T15:55:00Z\\\",\\\"guest_name\\\":\\\"Tomas Ito\\\",\\\"room\\\":\\\"Ember\\\",\\\"starts_on\\\":\\\"2026-05-04\\\",\\\"night\"\n ","results":{"c3a":[17.6,17.6,31.4,5.9,17.6,5.9,0.0],"c3b":[41.2,100.0,72.5,5.9,41.2,0.0,5.9]},"fails":{"c3a":[6,6,6,10,6,10,10],"c3b":[1,-1,6,10,1,10,10]}},{"id":"v3_release4_31_nest+rate_limit+refresh_rotation+idempotency_key_tickets","suite":"heal_v3_hint","tier":"B","title":"Solvo Tickets API","goal":"# Solvo Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.solvo.dev/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:tickets","base_path","noise","hidden_header","login_format:form","case:heal3","mutation:add_drift_nest","mutation:add_rate_limit","mutation:add_refresh_rotation","mutation:add_idempotency_key"],"n_requests":13,"requests":[["POST","https://api.solvo.dev/v1/login",200,"application/json"],["GET","https://api.solvo.dev/__flags",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.solvo.dev/v1/items",200,"application/json"],["GET","https://api.solvo.dev/v1/items/TCK-56720",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.solvo.dev/manifest.json",200,"application/json"],["POST","https://api.solvo.dev/v1/items",201,"application/json"],["PATCH","https://api.solvo.dev/v1/items/TCK-53747",429,"application/json"],["PATCH","https://api.solvo.dev/v1/items/TCK-53747",200,"application/json"],["DELETE","https://api.solvo.dev/v1/items/TCK-50488",401,"application/json"],["POST","https://api.solvo.dev/v1/token/refresh",200,"application/json"],["DELETE","https://api.solvo.dev/v1/items/TCK-50488",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.solvo.dev/v1/login\",\n \"headers\": {\n \"host\": \"api.solvo.dev\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-5.3\",\n \"origin\": \"https://app.solvo.dev\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.solvo.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"jwt\\\":\\\"tok_b0f599dec3a51a20fbc78786\\\",\\\"refresh_token\\\":\\\"rtk_57b4f9df24b96089b2763da5\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[17.6,11.8,29.4,41.2,0.0,58.8,17.6],"c3b":[76.5,17.6,47.1,17.6,17.6,17.6,17.6]},"fails":{"c3a":[6,6,10,1,10,11,10],"c3b":[4,10,10,10,10,10,10]}},{"id":"v3_sdk_40_epoch+rate_limit+async_create_shipments","suite":"heal_v3_hint","tier":"B","title":"Mirra Shipments API","goal":"# Mirra Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.mirra.net/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:link_header","domain:shipments","base_path","noise","etag_update","envelope","case:heal3","mutation:add_drift_epoch","mutation:add_rate_limit","mutation:add_async_create"],"n_requests":17,"requests":[["GET","https://api.mirra.net/sockjs-node/info",200,"application/json"],["POST","https://o60055426.ingest.sentry.io/api/60055426/envelope/?sentry_key=edc6e789996544bc8c6b0f2a",200,"application/json"],["GET","https://api.mirra.net/v1/records",200,"application/json"],["GET","https://api.mirra.net/v1/records?page=2",200,"application/json"],["GET","https://api.mirra.net/v1/records/SHP-58928",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.mirra.net/v1/records",202,"application/json"],["GET","https://api.mirra.net/v1/jobs/job_ec6422db4291",429,"application/json"],["GET","https://api.mirra.net/v1/jobs/job_ec6422db4291",200,"application/json"],["GET","https://api.mirra.net/v1/jobs/job_ec6422db4291",200,"application/json"],["GET","https://api.mirra.net/v1/jobs/job_ec6422db4291",200,"application/json"],["GET","https://api.mirra.net/v1/records/SHP-52986",200,"application/json"],["PATCH","https://api.mirra.net/v1/records/SHP-52986",429,"application/json"],["PATCH","https://api.mirra.net/v1/records/SHP-52986",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["DELETE","https://api.mirra.net/v1/records/SHP-55575",204,"x-unknown"],["GET","https://api.mirra.net/static/css/main.98eaa5b6.css",200,"text/css"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.mirra.net/sockjs-node/info\",\n \"headers\": {\n \"host\": \"api.mirra.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.mirra.net\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.mirra.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"websocket\\\":true,\\\"origins\\\":[\\\"*:*\\\"],\\\"cookie_needed\\\":false,\\\"entropy\\\":719922056}\"\n }\n }\n}","results":{"c3a":[0.0,100.0,66.7,0.0,0.0,100.0,100.0],"c3b":[100.0,100.0,100.0,0.0,0.0,0.0,0.0]},"fails":{"c3a":[3,-1,3,10,10,-1,-1],"c3b":[-1,-1,-1,10,3,10,10]}},{"id":"v3_sdk_41_rename+cents+rate_limit_tickets","suite":"heal_v3_hint","tier":"B","title":"Solora Tickets API","goal":"# Solora Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.solora.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:tickets","base_path","noise","etag_update","case:heal3","mutation:add_drift_rename","mutation:add_drift_cents","mutation:add_rate_limit"],"n_requests":11,"requests":[["GET","https://api.solora.dev/v2/tickets",200,"application/json"],["GET","https://api.solora.dev/v2/tickets?offset=10",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/006afadfd5de981b93c7f32d.woff2",200,"font/woff2"],["GET","https://api.solora.dev/v2/tickets/TCK-62176",200,"application/json"],["POST","https://api.solora.dev/v2/tickets",201,"application/json"],["GET","https://api.solora.dev/v2/tickets/TCK-18915",200,"application/json"],["PATCH","https://api.solora.dev/v2/tickets/TCK-18915",429,"application/json"],["PATCH","https://api.solora.dev/v2/tickets/TCK-18915",200,"application/json"],["GET","https://api.solora.dev/robots.txt",200,"text/plain"],["DELETE","https://api.solora.dev/v2/tickets/TCK-11492",204,"x-unknown"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.solora.dev/v2/tickets\",\n \"headers\": {\n \"host\": \"api.solora.dev\",\n \"connection\": \"keep-alive\",\n \"x-api-key\": \"sk_c12c6926455e8f23533b2c81\",\n \"origin\": \"https://app.solora.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.solora.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"results\\\":[{\\\"id\\\":\\\"TCK-50060\\\",\\\"created_at\\\":\\\"2026-01-05T18:05:00Z\\\",\\\"title\\\":\\\"Mobile app logs users out\\\",\\\"priority\\\":\\\"normal\\\",\\\"assignee\\\":\\\"Marta Lindqvist\\\",\\\"team\\\":\\\"security\\\",\\\"estimate_hours\\\":16,\\\"customer_visible\\\":false,\\\"fee_cents\\\":73953},{\\\"id\\\":\\\"TCK-52616\\\",\\\"created_at\\\":\\\"2026-01-05T18:31:00Z\\\",\\\"title\\\":\\\"Dashboard shows stale totals\\\",\\\"priority\\\":\\\"low\\\",\\\"assignee\\\":\\\"Amara Okoye\\\",\\\"team\\\":\\\"platform\\\",\\\"estimate_hours\\\":14,\\\"customer_visible\\\":true,\\\"fee_cents\\\":34182},{\\\"id\\\":\\\"TCK-74132\\\",\\\"created_at\\\":\\\"2026-01-05T19:30:00Z\\\",\\\"title\\\":\\\"Dashboard shows stale totals\\\",\\\"priority\\\":\\\"urgent\\\",\\\"assignee\\\":\\\"Dev Patel\\\",\\\"team\\\":\\\"platform\\\",\\\"estimate_hours\\\":30,\\\"customer_visible\\\":true,\\\"fee_cents\\\":54823},{\\\"id\\\":\\\"TCK-18915\\\",\\\"created_at\\\":\\\"20\"\n }","results":{"c3a":[100.0,100.0,100.0,100.0,0.0,5.9,0.0],"c3b":[100.0,100.0,66.7,5.9,5.9,5.9,5.9]},"fails":{"c3a":[-1,-1,-1,-1,10,10,10],"c3b":[-1,-1,3,10,3,10,10]}},{"id":"v3_sdk_42_cents+async_create+moved_samples","suite":"heal_v3_hint","tier":"B","title":"Torly Samples API","goal":"# Torly Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.torly.net/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:samples","base_path","noise","hidden_header","envelope","login_format:json","csrf_in:header","case:heal3","mutation:add_drift_cents","mutation:add_async_create","mutation:add_moved"],"n_requests":14,"requests":[["GET","https://api.torly.net/config.json",200,"application/json"],["POST","https://api.torly.net/v1/sessions",200,"application/json"],["GET","https://api.torly.net/v1/samples",200,"application/json"],["GET","https://api.torly.net/v1/samples?skip=10",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/d6262533ee2491114e807a5b.woff2",200,"font/woff2"],["GET","https://api.torly.net/v1/data/samples/SMP-45986",200,"application/json"],["POST","https://api.torly.net/v1/samples",202,"application/json"],["GET","https://api.torly.net/v1/tasks/job_5baf761be6ec",200,"application/json"],["GET","https://api.torly.net/v1/tasks/job_5baf761be6ec",200,"application/json"],["GET","https://api.torly.net/v1/tasks/job_5baf761be6ec",200,"application/json"],["PATCH","https://api.torly.net/v1/data/samples/SMP-12009",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-862386348",200,"application/javascript"],["DELETE","https://api.torly.net/v1/data/samples/SMP-87894",204,"x-unknown"],["GET","https://fonts.gstatic.com/s/inter/v13/e1c462706bdda65d3f63b5f9.woff2",200,"font/woff2"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.torly.net/config.json\",\n \"headers\": {\n \"host\": \"api.torly.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.torly.net\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.torly.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"672c5085\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,82.4,82.4,100.0,17.6],"c3b":[64.7,100.0,100.0,100.0,17.6,100.0,94.1]},"fails":{"c3a":[-1,-1,-1,2,2,-1,6],"c3b":[2,-1,-1,-1,3,-1,11]}},{"id":"v3_sdk_43_epoch+nest+refresh_rotation_bookings","suite":"heal_v3_hint","tier":"B","title":"Torton Bookings API","goal":"# Torton Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.torton.app/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:bookings","base_path","noise","etag_update","envelope","login_format:form","case:heal3","mutation:add_drift_epoch","mutation:add_drift_nest","mutation:add_refresh_rotation"],"n_requests":17,"requests":[["GET","https://api.torton.app/ping",200,"application/json"],["POST","https://api.torton.app/v2/auth/login",200,"application/json"],["GET","https://api.torton.app/v2/bookings",200,"application/json"],["GET","https://api.torton.app/v2/bookings?cursor=ZDY3NzViZjM6MTA",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-40243687",200,"application/javascript"],["GET","https://api.torton.app/v2/bookings/BKG-96499",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.torton.app/v2/bookings",401,"application/json"],["POST","https://api.torton.app/v2/token/refresh",200,"application/json"],["POST","https://api.torton.app/v2/bookings",201,"application/json"],["GET","https://api.torton.app/static/css/main.e2522cc6.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.torton.app/v2/bookings/BKG-69365",200,"application/json"],["PATCH","https://api.torton.app/v2/bookings/BKG-69365",200,"application/json"],["DELETE","https://api.torton.app/v2/bookings/BKG-31420",401,"application/json"],["POST","https://api.torton.app/v2/token/refresh",200,"application/json"],["DELETE","https://api.torton.app/v2/bookings/BKG-31420",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.torton.app/ping\",\n \"headers\": {\n \"host\": \"api.torton.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.torton.app\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.torton.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"status\\\":\\\"ok\\\",\\\"t\\\":443680134}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,17.6,17.6,17.6],"c3b":[17.6,0.0,11.8,0.0,17.6,0.0,100.0]},"fails":{"c3a":[6,6,6,6,6,6,6],"c3b":[6,10,6,3,6,3,-1]}},{"id":"v3_sdk_44_rename+refresh_rotation+moved_invoices","suite":"heal_v3_hint","tier":"B","title":"Sollo Invoices API","goal":"# Sollo Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.sollo.app/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:invoices","base_path","noise","login_format:form","case:heal3","mutation:add_drift_rename","mutation:add_refresh_rotation","mutation:add_moved"],"n_requests":13,"requests":[["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.sollo.app/v1/auth/token",200,"application/json"],["GET","https://api.sollo.app/v1/items",200,"application/json"],["GET","https://api.sollo.app/v1/items?cursor=YzE2OTUxMmI6MTA",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.sollo.app/sockjs-node/info",200,"application/json"],["GET","https://api.sollo.app/v1/entities/items/INV-48125",200,"application/json"],["POST","https://api.sollo.app/v1/items",401,"application/json"],["POST","https://api.sollo.app/v1/auth/refresh",200,"application/json"],["POST","https://api.sollo.app/v1/items",201,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-578741424&cid=578741424.578741424&en=page_view",204,"text/plain"],["PATCH","https://api.sollo.app/v1/entities/items/INV-53185",200,"application/json"],["DELETE","https://api.sollo.app/v1/entities/items/INV-82728",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.sollo.app/v1/auth/token\",\n \"headers\": {\n \"host\": \"api.sollo.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.sollo.app\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.sollo.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"jwt\\\":\\\"tok_a4c6eae1cf04a1ad7b83b160\\\",\\\"refresh_token\\\":\\\"rtk_ff69c4b52192c86cf5e258c9\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,72.5,0.0,17.6,17.6,17.6],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,3,6,6,6]}},{"id":"v3_sdk_45_rename+enum+idempotency_key_bookings","suite":"heal_v3_hint","tier":"B","title":"Kesik Bookings API","goal":"# Kesik Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.kesik.io/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:bookings","base_path","noise","etag_update","login_format:form","csrf_in:header","case:heal3","mutation:add_drift_rename","mutation:add_drift_enum","mutation:add_idempotency_key"],"n_requests":11,"requests":[["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.kesik.io/favicon.ico",200,"image/x-icon"],["POST","https://api.kesik.io/v3/auth/login",200,"application/json"],["GET","https://api.kesik.io/v3/items",200,"application/json"],["GET","https://api.kesik.io/v3/items?cursor=NWQ5NjNkOTk6MTA",200,"application/json"],["GET","https://api.kesik.io/v3/items/BKG-28896",200,"application/json"],["POST","https://api.kesik.io/v3/items",201,"application/json"],["GET","https://api.kesik.io/v3/items/BKG-65671",200,"application/json"],["PATCH","https://api.kesik.io/v3/items/BKG-65671",200,"application/json"],["DELETE","https://api.kesik.io/v3/items/BKG-40520",204,"x-unknown"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.kesik.io/v3/auth/login\",\n \"headers\": {\n \"host\": \"api.kesik.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.kesik.io\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.kesik.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_45337855\\\"}\"\n }\n }\n}","results":{"c3a":[100.0,41.2,100.0,82.4,0.0,100.0,0.0],"c3b":[41.2,41.2,100.0,82.4,82.4,41.2,100.0]},"fails":{"c3a":[-1,1,-1,1,1,-1,3],"c3b":[1,1,-1,1,1,1,-1]}},{"id":"v3_sdk_46_epoch+rate_limit+async_create_invoices","suite":"heal_v3_hint","tier":"B","title":"Kesvo Invoices API","goal":"# Kesvo Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.kesvo.co/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:link_header","domain:invoices","base_path","noise","envelope","case:heal3","mutation:add_drift_epoch","mutation:add_rate_limit","mutation:add_async_create"],"n_requests":13,"requests":[["GET","https://api.kesvo.co/config.json",200,"application/json"],["GET","https://api.kesvo.co/v3/invoices",200,"application/json"],["GET","https://api.kesvo.co/robots.txt",200,"text/plain"],["GET","https://api.kesvo.co/v3/invoices?p=2",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.kesvo.co/v3/invoices/INV-84745",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.kesvo.co/v3/invoices",202,"application/json"],["GET","https://api.kesvo.co/v3/tasks/job_ad1bb50ef644",200,"application/json"],["GET","https://api.kesvo.co/v3/tasks/job_ad1bb50ef644",429,"application/json"],["GET","https://api.kesvo.co/v3/tasks/job_ad1bb50ef644",200,"application/json"],["PATCH","https://api.kesvo.co/v3/invoices/INV-36474",200,"application/json"],["DELETE","https://api.kesvo.co/v3/invoices/INV-82382",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.kesvo.co/config.json\",\n \"headers\": {\n \"host\": \"api.kesvo.co\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.kesvo.co\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.kesvo.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"1a7cd148\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}","results":{"c3a":[5.9,5.9,94.1,5.9,0.0,82.4,5.9],"c3b":[100.0,5.9,100.0,5.9,0.0,100.0,5.9]},"fails":{"c3a":[10,10,2,10,10,2,10],"c3b":[-1,10,-1,10,3,-1,10]}},{"id":"v3_sdk_47_cents+nest+async_create_tickets","suite":"heal_v3_hint","tier":"B","title":"Veldex Tickets API","goal":"# Veldex Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.veldex.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:tickets","base_path","noise","hidden_header","envelope","case:heal3","mutation:add_drift_cents","mutation:add_drift_nest","mutation:add_async_create"],"n_requests":11,"requests":[["GET","https://api.veldex.dev/v2/tickets",200,"application/json"],["GET","https://api.veldex.dev/v2/tickets?skip=10",200,"application/json"],["GET","https://api.veldex.dev/v2/tickets/TCK-83675",200,"application/json"],["POST","https://api.veldex.dev/v2/tickets",202,"application/json"],["GET","https://api.veldex.dev/v2/jobs/job_0336520385c1",200,"application/json"],["GET","https://api.veldex.dev/v2/jobs/job_0336520385c1",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-784005689",200,"application/javascript"],["GET","https://fonts.gstatic.com/s/inter/v13/b35227b8d1f2be5885f82fe7.woff2",200,"font/woff2"],["GET","https://px.ads.linkedin.com/collect?pid=43077487&fmt=gif",204,"image/gif"],["PATCH","https://api.veldex.dev/v2/tickets/TCK-63362",200,"application/json"],["DELETE","https://api.veldex.dev/v2/tickets/TCK-65204",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.veldex.dev/v2/tickets\",\n \"headers\": {\n \"host\": \"api.veldex.dev\",\n \"connection\": \"keep-alive\",\n \"x-app-build\": \"8638\",\n \"api-key\": \"sk_87db0cb0ff4a91cf2822b981\",\n \"origin\": \"https://app.veldex.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.veldex.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"TCK-41526\\\",\\\"created_at\\\":\\\"2026-01-05T17:51:00Z\\\",\\\"title\\\":\\\"Bulk import times out\\\",\\\"priority\\\":\\\"urgent\\\",\\\"assignee\\\":\\\"Elin Berg\\\",\\\"queue\\\":\\\"billing\\\",\\\"estimate_hours\\\":22,\\\"customer_visible\\\":false,\\\"fee_cents\\\":7107,\\\"customer\\\":{\\\"name\\\":\\\"Elin Berg\\\",\\\"email\\\":\\\"lena.brandt@mail.test\\\"}},{\\\"id\\\":\\\"TCK-53320\\\",\\\"created_at\\\":\\\"2026-01-05T18:44:00Z\\\",\\\"title\\\":\\\"Role change not applied\\\",\\\"priority\\\":\\\"normal\\\",\\\"assignee\\\":\\\"Amara Okoye\\\",\\\"queue\\\":\\\"billing\\\",\\\"estimate_hours\\\":9,\\\"customer_visible\\\":true,\\\"fee_cents\\\":33980,\\\"customer\\\":{\\\"name\\\":\\\"Ines Varga\\\",\\\"email\\\":\\\"marta.lindqvist@mail.test\\\"}},{\\\"id\\\":\\\"TCK-16776\\\",\\\"created_at\\\":\\\"2026-01-05T20:44:00Z\\\",\\\"title\\\":\\\"Cannot reset two-factor device\\\",\\\"priority\\\":\\\"urgent\\\",\\","results":{"c3a":[100.0,100.0,100.0,17.6,82.4,100.0,58.8],"c3b":[100.0,100.0,100.0,100.0,35.3,82.4,82.4]},"fails":{"c3a":[-1,-1,-1,6,2,-1,11],"c3b":[-1,-1,-1,-1,3,2,3]}},{"id":"v3_single_00_cents_tickets","suite":"heal_v3_hint","tier":"B","title":"Quoora Tickets API","goal":"# Quoora Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quoora.io/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:tickets","base_path","noise","etag_update","hidden_header","envelope","login_format:form","case:heal3","mutation:add_drift_cents"],"n_requests":11,"requests":[["POST","https://api.quoora.io/v2/sessions",200,"application/json"],["GET","https://api.quoora.io/v2/tickets",200,"application/json"],["GET","https://api.quoora.io/v2/tickets?p=2",200,"application/json"],["GET","https://api.quoora.io/v2/tickets/TCK-53321",200,"application/json"],["POST","https://api.quoora.io/v2/tickets",201,"application/json"],["GET","https://api.quoora.io/v2/tickets/TCK-48522",200,"application/json"],["PATCH","https://api.quoora.io/v2/tickets/TCK-48522",200,"application/json"],["DELETE","https://api.quoora.io/v2/tickets/TCK-36180",204,"x-unknown"],["GET","https://api.quoora.io/static/css/main.9a5fce5b.css",200,"text/css"],["GET","https://cdn.segment.com/analytics.js/v1/578d75d4d4683dc223f073dc/analytics.min.js",200,"application/javascript"],["GET","https://api.quoora.io/static/js/main.4b0bed3f.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.quoora.io/v2/sessions\",\n \"headers\": {\n \"host\": \"api.quoora.io\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-2.4\",\n \"origin\": \"https://app.quoora.io\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.quoora.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"token\\\":\\\"tok_20e5d7d2f0bb08fec7046e33\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,45.1,0.0,0.0,58.8,17.6],"c3b":[100.0,100.0,100.0,0.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,0,0,11,6],"c3b":[-1,-1,-1,0,-1,-1,-1]}},{"id":"v3_single_01_cents_samples","suite":"heal_v3_hint","tier":"B","title":"Pelora Samples API","goal":"# Pelora Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pelora.net/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:samples","base_path","noise","etag_update","hidden_header","envelope","case:heal3","mutation:add_drift_cents"],"n_requests":10,"requests":[["GET","https://api.pelora.net/static/js/main.674ff530.js",200,"application/javascript"],["GET","https://api.pelora.net/v3/records",200,"application/json"],["GET","https://api.pelora.net/v3/records?offset=10",200,"application/json"],["GET","https://api.pelora.net/v3/records/SMP-38760",200,"application/json"],["POST","https://api.pelora.net/v3/records",201,"application/json"],["GET","https://api.pelora.net/v3/records/SMP-39629",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["PATCH","https://api.pelora.net/v3/records/SMP-39629",200,"application/json"],["DELETE","https://api.pelora.net/v3/records/SMP-29050",204,"x-unknown"],["GET","https://px.ads.linkedin.com/collect?pid=289326044&fmt=gif",204,"image/gif"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.pelora.net/v3/records\",\n \"headers\": {\n \"host\": \"api.pelora.net\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-5.8\",\n \"x-auth-key\": \"sk_7f86f955f54ba319c9a6c8a8\",\n \"origin\": \"https://app.pelora.net\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pelora.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"SMP-39629\\\",\\\"created_at\\\":\\\"2026-01-05T10:15:00Z\\\",\\\"assay\\\":\\\"elisa\\\",\\\"lab\\\":\\\"north\\\",\\\"volume_ul\\\":640.7,\\\"collected_on\\\":\\\"2026-10-05\\\",\\\"batch\\\":\\\"B-3207\\\",\\\"hazardous\\\":false,\\\"amount_cents\\\":8930},{\\\"id\\\":\\\"SMP-11806\\\",\\\"created_at\\\":\\\"2026-01-05T11:32:00Z\\\",\\\"assay\\\":\\\"elisa\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":46.3,\\\"collected_on\\\":\\\"2026-07-28\\\",\\\"batch\\\":\\\"B-5947\\\",\\\"hazardous\\\":true,\\\"amount_cents\\\":5846},{\\\"id\\\":\\\"SMP-28500\\\",\\\"created_at\\\":\\\"2026-01-05T11:39:00Z\\\",\\\"assay\\\":\\\"pcr\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":707.6,\\\"collected_on\\\":\\\"2026-01-17\\\",\\\"batch\\\":\\\"B-1920\\\",\\\"hazardous\\\":true,\\\"amount_cents\\\":21096},{\\\"id\\\":\\\"SMP-77557\\\",\\\"created_at\\\":\\\"2026-01-05T11:50:00Z\\\",\\\"assay\\\":\\\"elisa\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":413.4","results":{"c3a":[17.6,17.6,17.6,100.0,100.0,58.8,17.6],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,-1,-1,11,6]}},{"id":"v3_single_02_epoch_shipments","suite":"heal_v3_hint","tier":"B","title":"Fenlo Shipments API","goal":"# Fenlo Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.fenlo.dev/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:shipments","base_path","noise","token_expiry","hidden_header","envelope","login_format:json","csrf_in:json","case:heal3","mutation:add_drift_epoch"],"n_requests":11,"requests":[["POST","https://o428287931.ingest.sentry.io/api/428287931/envelope/?sentry_key=85712a283cd85d2d6aada3c1",200,"application/json"],["POST","https://api.fenlo.dev/v1/login",200,"application/json"],["GET","https://api.fenlo.dev/v1/records",200,"application/json"],["GET","https://api.fenlo.dev/v1/records/SHP-98526",200,"application/json"],["POST","https://api.fenlo.dev/v1/records",201,"application/json"],["PATCH","https://api.fenlo.dev/v1/records/SHP-64247",200,"application/json"],["DELETE","https://api.fenlo.dev/v1/records/SHP-69826",401,"application/json"],["POST","https://api.fenlo.dev/v1/login",200,"application/json"],["DELETE","https://api.fenlo.dev/v1/records/SHP-69826",204,"x-unknown"],["GET","https://api.fenlo.dev/favicon.ico",200,"image/x-icon"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o428287931.ingest.sentry.io/api/428287931/envelope/?sentry_key=85712a283cd85d2d6aada3c1\",\n \"headers\": {\n \"host\": \"o428287931.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.fenlo.dev\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.fenlo.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"94e53e662dc1fbb3c9e55e60\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,45.1,17.6,100.0,100.0,0.0],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,17.6]},"fails":{"c3a":[6,6,6,6,-1,-1,1],"c3b":[-1,-1,-1,-1,-1,-1,6]}},{"id":"v3_single_03_epoch_bookings","suite":"heal_v3_hint","tier":"B","title":"Nimrix Bookings API","goal":"# Nimrix Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.nimrix.co/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:bookings","base_path","noise","etag_update","hidden_header","envelope","login_format:json","case:heal3","mutation:add_drift_epoch"],"n_requests":11,"requests":[["GET","https://api.nimrix.co/robots.txt",200,"text/plain"],["POST","https://api.nimrix.co/v3/auth/login",200,"application/json"],["GET","https://api.nimrix.co/v3/bookings",200,"application/json"],["GET","https://api.nimrix.co/v3/bookings?cursor=ZWZhZWM1ZmY6MTA",200,"application/json"],["GET","https://api.nimrix.co/v3/bookings/BKG-12851",200,"application/json"],["POST","https://api.nimrix.co/v3/bookings",201,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.nimrix.co/v3/bookings/BKG-29189",200,"application/json"],["PATCH","https://api.nimrix.co/v3/bookings/BKG-29189",200,"application/json"],["DELETE","https://api.nimrix.co/v3/bookings/BKG-85437",204,"x-unknown"],["GET","https://api.nimrix.co/manifest.json",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.nimrix.co/v3/auth/login\",\n \"headers\": {\n \"host\": \"api.nimrix.co\",\n \"connection\": \"keep-alive\",\n \"x-client-version\": \"6.11.3\",\n \"origin\": \"https://app.nimrix.co\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.nimrix.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"access_token\\\":\\\"tok_d02d03752584e695f815a959\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,100.0,100.0,100.0,100.0,100.0,17.6],"c3b":[100.0,100.0,100.0,17.6,100.0,17.6,100.0]},"fails":{"c3a":[6,-1,-1,-1,-1,-1,6],"c3b":[-1,-1,-1,6,-1,6,-1]}},{"id":"v3_single_04_nest_invoices","suite":"heal_v3_hint","tier":"B","title":"Torra Invoices API","goal":"# Torra Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.torra.com/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:none","domain:invoices","base_path","noise","etag_update","hidden_header","case:heal3","mutation:add_drift_nest"],"n_requests":9,"requests":[["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-738161063&cid=738161063.738161063&en=page_view",204,"text/plain"],["GET","https://api.torra.com/v1/items",200,"application/json"],["GET","https://api.torra.com/v1/items/INV-55231",200,"application/json"],["POST","https://api.torra.com/v1/items",201,"application/json"],["GET","https://api.torra.com/v1/items/INV-97615",200,"application/json"],["PATCH","https://api.torra.com/v1/items/INV-97615",200,"application/json"],["DELETE","https://api.torra.com/v1/items/INV-27580",204,"x-unknown"],["GET","https://px.ads.linkedin.com/collect?pid=785158709&fmt=gif",204,"image/gif"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.torra.com/v1/items\",\n \"headers\": {\n \"host\": \"api.torra.com\",\n \"connection\": \"keep-alive\",\n \"x-app-build\": \"4693\",\n \"x-auth-key\": \"sk_67f7ab9917a8aa6c2dd06610\",\n \"origin\": \"https://app.torra.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.torra.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"[{\\\"id\\\":\\\"INV-28356\\\",\\\"created_at\\\":\\\"2026-01-05T13:40:00Z\\\",\\\"customer\\\":\\\"Corvid Labs\\\",\\\"state\\\":\\\"draft\\\",\\\"amount_cents\\\":366999,\\\"currency\\\":\\\"USD\\\",\\\"due_date\\\":\\\"2026-04-21\\\",\\\"memo\\\":\\\"Bulk import times out\\\",\\\"contact\\\":{\\\"name\\\":\\\"Tomas Ito\\\",\\\"email\\\":\\\"ines.varga@mail.test\\\"}},{\\\"id\\\":\\\"INV-55231\\\",\\\"created_at\\\":\\\"2026-01-05T14:28:00Z\\\",\\\"customer\\\":\\\"Lumen & Sons\\\",\\\"state\\\":\\\"draft\\\",\\\"amount_cents\\\":589313,\\\"currency\\\":\\\"EUR\\\",\\\"due_date\\\":\\\"2026-05-19\\\",\\\"memo\\\":\\\"Bulk import times out\\\",\\\"contact\\\":{\\\"name\\\":\\\"Amara Okoye\\\",\\\"email\\\":\\\"sofia.duarte@corp.test\\\"}},{\\\"id\\\":\\\"INV-66182\\\",\\\"created_at\\\":\\\"2026-01-05T16:12:00Z\\\",\\\"customer\\\":\\\"Ostrava Tools\\\",\\\"state\\\":\\\"paid\\\",\\\"amount_cents\\\":774569,\\\"currency\\\":\\\"EUR\\\",\\\"due_date\\\":\\\"2026-04-20\\\",\\\"memo\\","results":{"c3a":[17.6,17.6,31.4,58.8,58.8,100.0,58.8],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[6,6,6,11,11,-1,11]}},{"id":"v3_single_05_nest_tickets","suite":"heal_v3_hint","tier":"B","title":"Quoly Tickets API","goal":"# Quoly Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quoly.io/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:tickets","base_path","noise","token_expiry","etag_update","login_format:form","csrf_in:json","case:heal3","mutation:add_drift_nest"],"n_requests":14,"requests":[["GET","https://px.ads.linkedin.com/collect?pid=10350852&fmt=gif",204,"image/gif"],["GET","https://www.googletagmanager.com/gtag/js?id=G-820685516",200,"application/javascript"],["POST","https://api.quoly.io/v3/login",200,"application/json"],["GET","https://api.quoly.io/v3/items",200,"application/json"],["GET","https://api.quoly.io/v3/items?page_token=ZDE3NDAzNWM6MTA",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.quoly.io/v3/items/TCK-92686",200,"application/json"],["POST","https://api.quoly.io/v3/items",201,"application/json"],["GET","https://api.quoly.io/__flags",200,"application/json"],["GET","https://api.quoly.io/v3/items/TCK-65242",401,"application/json"],["POST","https://api.quoly.io/v3/login",200,"application/json"],["GET","https://api.quoly.io/v3/items/TCK-65242",200,"application/json"],["PATCH","https://api.quoly.io/v3/items/TCK-65242",200,"application/json"],["DELETE","https://api.quoly.io/v3/items/TCK-25735",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.quoly.io/v3/login\",\n \"headers\": {\n \"host\": \"api.quoly.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.quoly.io\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.quoly.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_59651c24\\\",\\\"csrf_token\\\":\\\"f1cd982ed64adbd2\\\"}\"\n }\n }\n}","results":{"c3a":[58.8,58.8,45.1,58.8,58.8,58.8,58.8],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[11,11,6,11,11,11,11]}},{"id":"v3_single_06_rate_limit_invoices","suite":"heal_v3_hint","tier":"B","title":"Zanlo Invoices API","goal":"# Zanlo Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.zanlo.co/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:link_header","domain:invoices","base_path","noise","etag_update","hidden_header","login_format:json","csrf_in:header","case:heal3","mutation:add_rate_limit"],"n_requests":13,"requests":[["POST","https://api.zanlo.co/api/auth/login",200,"application/json"],["GET","https://api.zanlo.co/api/items",200,"application/json"],["GET","https://api.zanlo.co/api/items?p=2",200,"application/json"],["GET","https://api.zanlo.co/api/items/INV-88884",200,"application/json"],["GET","https://api.zanlo.co/",200,"text/html"],["POST","https://api.zanlo.co/api/items",429,"application/json"],["POST","https://api.zanlo.co/api/items",201,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-225345651&cid=225345651.225345651&en=page_view",204,"text/plain"],["GET","https://api.zanlo.co/api/items/INV-63225",200,"application/json"],["PATCH","https://api.zanlo.co/api/items/INV-63225",200,"application/json"],["GET","https://api.zanlo.co/ping",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["DELETE","https://api.zanlo.co/api/items/INV-97333",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.zanlo.co/api/auth/login\",\n \"headers\": {\n \"host\": \"api.zanlo.co\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-09-05\",\n \"origin\": \"https://app.zanlo.co\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.zanlo.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_e4b3136f\\\"}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,0.0,0.0,100.0,100.0],"c3b":[100.0,100.0,100.0,100.0,58.8,100.0,100.0]},"fails":{"c3a":[-1,-1,-1,3,0,-1,-1],"c3b":[-1,-1,-1,-1,4,-1,-1]}},{"id":"v3_single_07_rate_limit_samples","suite":"heal_v3_hint","tier":"B","title":"Lumvo Samples API","goal":"# Lumvo Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.lumvo.app/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:samples","base_path","noise","token_expiry","login_format:form","case:heal3","mutation:add_rate_limit"],"n_requests":14,"requests":[["POST","https://api.lumvo.app/v2/login",200,"application/json"],["GET","https://api.lumvo.app/v2/samples",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/55cf1403d0e998a15df90932.woff2",200,"font/woff2"],["GET","https://api.lumvo.app/v2/samples/SMP-99483",200,"application/json"],["POST","https://api.lumvo.app/v2/samples",429,"application/json"],["POST","https://api.lumvo.app/v2/samples",201,"application/json"],["PATCH","https://api.lumvo.app/v2/samples/SMP-82443",200,"application/json"],["DELETE","https://api.lumvo.app/v2/samples/SMP-89594",401,"application/json"],["POST","https://api.lumvo.app/v2/login",429,"application/json"],["POST","https://api.lumvo.app/v2/login",200,"application/json"],["DELETE","https://api.lumvo.app/v2/samples/SMP-89594",204,"x-unknown"],["GET","https://api.lumvo.app/config.json",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.lumvo.app/v2/login\",\n \"headers\": {\n \"host\": \"api.lumvo.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.lumvo.app\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.lumvo.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"access_token\\\":\\\"tok_fa94dd30d0a680036e128718\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,23.5,23.5,100.0,0.0],"c3b":[100.0,100.0,72.5,100.0,23.5,23.5,100.0]},"fails":{"c3a":[-1,-1,-1,10,10,-1,3],"c3b":[-1,-1,6,-1,10,10,-1]}},{"id":"v3_single_08_async_create_bookings","suite":"heal_v3_hint","tier":"B","title":"Lumik Bookings API","goal":"# Lumik Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.lumik.dev/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:link_header","domain:bookings","base_path","noise","envelope","case:heal3","mutation:add_async_create"],"n_requests":13,"requests":[["GET","https://api.lumik.dev/__flags",200,"application/json"],["GET","https://api.lumik.dev/api/records",200,"application/json"],["GET","https://api.lumik.dev/api/records?page=2",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://o244781291.ingest.sentry.io/api/244781291/envelope/?sentry_key=77691a46a95ab3a3ce9db102",200,"application/json"],["GET","https://api.lumik.dev/api/records/BKG-98839",200,"application/json"],["POST","https://api.lumik.dev/api/records",202,"application/json"],["GET","https://api.lumik.dev/api/jobs/job_6b31a8118211",200,"application/json"],["GET","https://api.lumik.dev/api/jobs/job_6b31a8118211",200,"application/json"],["GET","https://api.lumik.dev/api/jobs/job_6b31a8118211",200,"application/json"],["PATCH","https://api.lumik.dev/api/records/BKG-31365",200,"application/json"],["DELETE","https://api.lumik.dev/api/records/BKG-65139",204,"x-unknown"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.lumik.dev/__flags\",\n \"headers\": {\n \"host\": \"api.lumik.dev\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.lumik.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.lumik.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"a9bcc9ae\\\"}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,0.0,100.0,0.0,100.0],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,82.4]},"fails":{"c3a":[-1,-1,-1,0,-1,0,-1],"c3b":[-1,-1,-1,-1,-1,-1,2]}},{"id":"v3_single_09_async_create_shipments","suite":"heal_v3_hint","tier":"B","title":"Nimlo Shipments API","goal":"# Nimlo Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.nimlo.app/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:shipments","base_path","noise","token_expiry","etag_update","envelope","login_format:json","case:heal3","mutation:add_async_create"],"n_requests":21,"requests":[["GET","https://cdn.segment.com/analytics.js/v1/4cfa3f64cfe3260b4be82d98/analytics.min.js",200,"application/javascript"],["POST","https://api.nimlo.app/api/sessions",200,"application/json"],["GET","https://api.nimlo.app/api/shipments",200,"application/json"],["GET","https://api.nimlo.app/api/shipments?p=2",200,"application/json"],["GET","https://api.nimlo.app/static/css/main.6f5c1c28.css",200,"text/css"],["GET","https://api.nimlo.app/static/css/main.2da31743.css",200,"text/css"],["GET","https://api.nimlo.app/api/shipments/SHP-10962",200,"application/json"],["POST","https://api.nimlo.app/api/shipments",202,"application/json"],["GET","https://api.nimlo.app/api/tasks/job_0a6028a9d77b",401,"application/json"],["POST","https://api.nimlo.app/api/sessions",200,"application/json"],["GET","https://api.nimlo.app/api/tasks/job_0a6028a9d77b",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.nimlo.app/api/tasks/job_0a6028a9d77b",200,"application/json"],["GET","https://api.nimlo.app/api/tasks/job_0a6028a9d77b",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/3d41871c9f594fcf6fad4439.woff2",200,"font/woff2"],["GET","https://api.nimlo.app/__flags",200,"application/json"],["GET","https://api.nimlo.app/api/shipments/SHP-78696",200,"application/json"],["PATCH","https://api.nimlo.app/api/shipments/SHP-78696",401,"application/json"],["POST","https://api.nimlo.app/api/sessions",200,"application/json"],["PATCH","https://api.nimlo.app/api/shipments/SHP-78696",200,"application/json"],["DELETE","https://api.nimlo.app/api/shipments/SHP-92712",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.nimlo.app/api/sessions\",\n \"headers\": {\n \"host\": \"api.nimlo.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.nimlo.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.nimlo.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"token\\\":\\\"tok_1ebfb8e0e5eeea21c5fb5f0e\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,0.0,82.4,100.0,100.0],"c3b":[100.0,100.0,100.0,0.0,0.0,100.0,5.9]},"fails":{"c3a":[-1,-1,-1,0,2,-1,-1],"c3b":[-1,-1,-1,0,0,-1,0]}},{"id":"v3_single_10_refresh_rotation_invoices","suite":"heal_v3_hint","tier":"B","title":"Broium Invoices API","goal":"# Broium Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.broium.io/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:invoices","base_path","noise","etag_update","login_format:json","case:heal3","mutation:add_refresh_rotation"],"n_requests":14,"requests":[["POST","https://api.broium.io/v1/auth/login",200,"application/json"],["GET","https://api.broium.io/v1/invoices",200,"application/json"],["GET","https://api.broium.io/v1/invoices?p=2",200,"application/json"],["GET","https://api.broium.io/manifest.json",200,"application/json"],["GET","https://api.broium.io/static/js/main.71110ecf.js",200,"application/javascript"],["GET","https://api.broium.io/v1/invoices/INV-20491",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=640488871&fmt=gif",204,"image/gif"],["POST","https://api.broium.io/v1/invoices",201,"application/json"],["GET","https://api.broium.io/v1/invoices/INV-23928",401,"application/json"],["POST","https://api.broium.io/v1/refresh",200,"application/json"],["GET","https://api.broium.io/v1/invoices/INV-23928",200,"application/json"],["PATCH","https://api.broium.io/v1/invoices/INV-23928",200,"application/json"],["GET","https://api.broium.io/__flags",200,"application/json"],["DELETE","https://api.broium.io/v1/invoices/INV-29091",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.broium.io/v1/auth/login\",\n \"headers\": {\n \"host\": \"api.broium.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.broium.io\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.broium.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"jwt\\\":\\\"tok_2a13a596dc0786ccfdbb4e3f\\\",\\\"refresh_token\\\":\\\"rtk_df2cff13acf0915f59ba88b9\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[5.9,100.0,100.0,100.0,0.0,0.0,100.0],"c3b":[100.0,100.0,100.0,100.0,0.0,100.0,100.0]},"fails":{"c3a":[0,-1,-1,-1,0,0,-1],"c3b":[-1,-1,-1,-1,0,-1,-1]}},{"id":"v3_single_11_refresh_rotation_bookings","suite":"heal_v3_hint","tier":"B","title":"Havna Bookings API","goal":"# Havna Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havna.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:bookings","base_path","noise","etag_update","hidden_header","login_format:form","case:heal3","mutation:add_refresh_rotation"],"n_requests":17,"requests":[["POST","https://api.havna.dev/v2/sessions",200,"application/json"],["GET","https://api.havna.dev/v2/items",200,"application/json"],["GET","https://api.havna.dev/v2/items?page_token=ODBmZTRhNGU6MTA",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.havna.dev/config.json",200,"application/json"],["GET","https://api.havna.dev/v2/items/BKG-32544",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-722740470",200,"application/javascript"],["POST","https://api.havna.dev/v2/items",401,"application/json"],["POST","https://api.havna.dev/v2/token/refresh",200,"application/json"],["POST","https://api.havna.dev/v2/items",201,"application/json"],["GET","https://api.havna.dev/v2/items/BKG-52720",200,"application/json"],["PATCH","https://api.havna.dev/v2/items/BKG-52720",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["DELETE","https://api.havna.dev/v2/items/BKG-77379",401,"application/json"],["POST","https://api.havna.dev/v2/token/refresh",200,"application/json"],["GET","https://api.havna.dev/static/js/main.0edc1445.js",200,"application/javascript"],["DELETE","https://api.havna.dev/v2/items/BKG-77379",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.havna.dev/v2/sessions\",\n \"headers\": {\n \"host\": \"api.havna.dev\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-09-04\",\n \"origin\": \"https://app.havna.dev\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havna.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"token\\\":\\\"tok_5cf3919cd3291772d02aee1e\\\",\\\"refresh_token\\\":\\\"rtk_e8e374199dd75405b027fe6b\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,100.0,100.0,100.0,100.0],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]}},{"id":"v3_single_12_idempotency_key_samples","suite":"heal_v3_hint","tier":"B","title":"Solium Samples API","goal":"# Solium Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.solium.app/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:samples","base_path","noise","etag_update","hidden_header","login_format:json","csrf_in:json","case:heal3","mutation:add_idempotency_key"],"n_requests":10,"requests":[["GET","https://api.solium.app/robots.txt",200,"text/plain"],["POST","https://api.solium.app/v3/sessions",200,"application/json"],["GET","https://api.solium.app/v3/samples",200,"application/json"],["GET","https://api.solium.app/v3/samples/SMP-58624",200,"application/json"],["GET","https://api.solium.app/",200,"text/html"],["POST","https://api.solium.app/v3/samples",201,"application/json"],["GET","https://api.solium.app/v3/samples/SMP-72964",200,"application/json"],["PATCH","https://api.solium.app/v3/samples/SMP-72964",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["DELETE","https://api.solium.app/v3/samples/SMP-58105",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.solium.app/v3/sessions\",\n \"headers\": {\n \"host\": \"api.solium.app\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-04-13\",\n \"origin\": \"https://app.solium.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.solium.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_9b03d2b0\\\",\\\"csrf_token\\\":\\\"a930ba563b9db25b\\\"}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,100.0,58.8,100.0,100.0],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c3a":[-1,-1,-1,-1,4,-1,-1]}},{"id":"v3_single_13_idempotency_key_tickets","suite":"heal_v3_hint","tier":"B","title":"Zanly Tickets API","goal":"# Zanly Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.zanly.co/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:tickets","base_path","noise","etag_update","envelope","case:heal3","mutation:add_idempotency_key"],"n_requests":10,"requests":[["GET","https://api.zanly.co/manifest.json",200,"application/json"],["GET","https://api.zanly.co/v2/items",200,"application/json"],["GET","https://api.zanly.co/v2/items?cursor=NTMzNGI0MmE6MTA",200,"application/json"],["GET","https://api.zanly.co/v2/items/TCK-66781",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-953330797",200,"application/javascript"],["POST","https://api.zanly.co/v2/items",201,"application/json"],["GET","https://api.zanly.co/v2/items/TCK-48858",200,"application/json"],["PATCH","https://api.zanly.co/v2/items/TCK-48858",200,"application/json"],["DELETE","https://api.zanly.co/v2/items/TCK-37584",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.zanly.co/manifest.json\",\n \"headers\": {\n \"host\": \"api.zanly.co\",\n \"connection\": \"keep-alive\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"manifest\",\n \"referer\": \"https://app.zanly.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"short_name\\\":\\\"App\\\",\\\"start_url\\\":\\\".\\\",\\\"display\\\":\\\"standalone\\\",\\\"icons\\\":[]}\"\n }\n }\n}","results":{"c3a":[100.0,100.0,100.0,100.0,100.0,100.0,100.0],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]}},{"id":"v3_terse_56_cents+idempotency_key+moved_invoices","suite":"heal_v3_hint","tier":"B","title":"Zanlo Invoices API","goal":"# Zanlo Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.zanlo.io/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:invoices","base_path","noise","etag_update","hidden_header","case:heal3","mutation:add_drift_cents","mutation:add_idempotency_key","mutation:add_moved"],"n_requests":10,"requests":[["GET","https://api.zanlo.io/v3/invoices",200,"application/json"],["GET","https://api.zanlo.io/v3/invoices?after=ZDQ0NGQ0YjM6MTA",200,"application/json"],["GET","https://api.zanlo.io/v3/entities/invoices/INV-42654",200,"application/json"],["POST","https://api.zanlo.io/v3/invoices",201,"application/json"],["GET","https://static.hotjar.com/c/hotjar-66063935.js?sv=6",200,"application/javascript"],["GET","https://api.zanlo.io/v3/entities/invoices/INV-81938",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-842049799.js?sv=6",200,"application/javascript"],["PATCH","https://api.zanlo.io/v3/entities/invoices/INV-81938",200,"application/json"],["DELETE","https://api.zanlo.io/v3/entities/invoices/INV-89041",204,"x-unknown"],["GET","https://static.hotjar.com/c/hotjar-522242529.js?sv=6",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.zanlo.io/v3/invoices\",\n \"headers\": {\n \"host\": \"api.zanlo.io\",\n \"connection\": \"keep-alive\",\n \"x-platform\": \"web-4.4\",\n \"x-auth-key\": \"sk_0a035ab6c97507ecd88a02b5\",\n \"origin\": \"https://app.zanlo.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.zanlo.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"results\\\":[{\\\"id\\\":\\\"INV-49121\\\",\\\"created_at\\\":\\\"2026-01-05T12:03:00Z\\\",\\\"customer\\\":\\\"Mosaic Freight\\\",\\\"state\\\":\\\"draft\\\",\\\"amount_cents\\\":734063,\\\"currency\\\":\\\"GBP\\\",\\\"due_date\\\":\\\"2026-06-22\\\",\\\"memo\\\":\\\"Search ignores accented names\\\",\\\"deposit_cents\\\":50978},{\\\"id\\\":\\\"INV-53498\\\",\\\"created_at\\\":\\\"2026-01-05T13:57:00Z\\\",\\\"customer\\\":\\\"Mosaic Freight\\\",\\\"state\\\":\\\"draft\\\",\\\"amount_cents\\\":644773,\\\"currency\\\":\\\"GBP\\\",\\\"due_date\\\":\\\"2026-08-04\\\",\\\"memo\\\":\\\"Bulk import times out\\\",\\\"deposit_cents\\\":44401},{\\\"id\\\":\\\"INV-14359\\\",\\\"created_at\\\":\\\"2026-01-05T15:38:00Z\\\",\\\"customer\\\":\\\"Corvid Labs\\\",\\\"state\\\":\\\"draft\\\",\\\"amount_cents\\\":222815,\\\"currency\\\":\\\"EUR\\\",\\\"due_date\\\":\\\"2026-01-01\\\",\\\"memo\\\":\\\"Cannot reset two-factor device\\\",\\\"deposit_cents\\\":60129},{\\\"id\\\":\\\"IN","results":{"c3a":[0.0,17.6,45.1,17.6,100.0,100.0,41.2],"c3b":[0.0,100.0,100.0,41.2,41.2,17.6,41.2]},"fails":{"c3a":[1,6,6,6,-1,-1,1],"c3b":[1,-1,-1,1,1,6,1]}},{"id":"v3_terse_57_rename+epoch+idempotency_key_tickets","suite":"heal_v3_hint","tier":"B","title":"Pelant Tickets API","goal":"# Pelant Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pelant.net/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:tickets","base_path","noise","token_expiry","etag_update","login_format:form","csrf_in:json","case:heal3","mutation:add_drift_rename","mutation:add_drift_epoch","mutation:add_idempotency_key"],"n_requests":14,"requests":[["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=523126509&fmt=gif",204,"image/gif"],["POST","https://api.pelant.net/api/login",200,"application/json"],["GET","https://api.pelant.net/api/records",200,"application/json"],["GET","https://api.pelant.net/api/records?page_token=MDI4NmI2ZDE6MTA",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=733416426&fmt=gif",204,"image/gif"],["GET","https://api.pelant.net/api/records/TCK-13688",200,"application/json"],["POST","https://api.pelant.net/api/records",201,"application/json"],["GET","https://api.pelant.net/api/records/TCK-83602",401,"application/json"],["POST","https://api.pelant.net/api/login",200,"application/json"],["GET","https://api.pelant.net/api/records/TCK-83602",200,"application/json"],["PATCH","https://api.pelant.net/api/records/TCK-83602",200,"application/json"],["GET","https://api.pelant.net/__flags",200,"application/json"],["DELETE","https://api.pelant.net/api/records/TCK-93127",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.pelant.net\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pelant.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,31.4,0.0,17.6,100.0,11.8],"c3b":[41.2,41.2,100.0,11.8,17.6,0.0,100.0]},"fails":{"c3a":[6,6,6,1,4,-1,6],"c3b":[1,1,-1,6,6,1,-1]}},{"id":"v3_terse_58_nest+async_create+moved_shipments","suite":"heal_v3_hint","tier":"B","title":"Quoton Shipments API","goal":"# Quoton Shipments API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quoton.io/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:shipments","base_path","noise","envelope","case:heal3","mutation:add_drift_nest","mutation:add_async_create","mutation:add_moved"],"n_requests":13,"requests":[["GET","https://api.quoton.io/favicon.ico",200,"image/x-icon"],["POST","https://o471610018.ingest.sentry.io/api/471610018/envelope/?sentry_key=fce0e232e3f146eda957d771",200,"application/json"],["GET","https://api.quoton.io/api/records",200,"application/json"],["GET","https://api.quoton.io/api/records?offset=10",200,"application/json"],["GET","https://api.quoton.io/api/entities/records/SHP-15611",200,"application/json"],["POST","https://o694327860.ingest.sentry.io/api/694327860/envelope/?sentry_key=2085c992cbb8e416c23fec71",200,"application/json"],["GET","https://api.quoton.io/config.json",200,"application/json"],["POST","https://api.quoton.io/api/records",202,"application/json"],["GET","https://api.quoton.io/api/tasks/job_aff5105ef1d0",200,"application/json"],["GET","https://api.quoton.io/api/tasks/job_aff5105ef1d0",200,"application/json"],["GET","https://api.quoton.io/api/tasks/job_aff5105ef1d0",200,"application/json"],["PATCH","https://api.quoton.io/api/entities/records/SHP-31651",200,"application/json"],["DELETE","https://api.quoton.io/api/entities/records/SHP-75451",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o471610018.ingest.sentry.io/api/471610018/envelope/?sentry_key=fce0e232e3f146eda957d771\",\n \"headers\": {\n \"host\": \"o471610018.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.quoton.io\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.quoton.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"7e4d2b40521a58048a595e4e\\\"}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,31.4,17.6,17.6,17.6,17.6],"c3b":[100.0,100.0,100.0,100.0,100.0,100.0,0.0]},"fails":{"c3a":[6,6,6,6,6,6,6],"c3b":[-1,-1,-1,-1,-1,-1,2]}},{"id":"v3_terse_59_cents+epoch+rate_limit_samples","suite":"heal_v3_hint","tier":"B","title":"Nimlo Samples API","goal":"# Nimlo Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.nimlo.net/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:samples","base_path","noise","token_expiry","hidden_header","envelope","login_format:form","csrf_in:header","case:heal3","mutation:add_drift_cents","mutation:add_drift_epoch","mutation:add_rate_limit"],"n_requests":13,"requests":[["GET","https://api.nimlo.net/config.json",200,"application/json"],["POST","https://api.nimlo.net/api/login",200,"application/json"],["GET","https://api.nimlo.net/api/records",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-875338923.js?sv=6",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/d39c10aed389667a0779e10b/analytics.min.js",200,"application/javascript"],["GET","https://api.nimlo.net/api/records/SMP-88550",200,"application/json"],["POST","https://api.nimlo.net/api/records",201,"application/json"],["POST","https://o590739624.ingest.sentry.io/api/590739624/envelope/?sentry_key=f2dad501219289ad75e64539",200,"application/json"],["PATCH","https://api.nimlo.net/api/records/SMP-65632",200,"application/json"],["DELETE","https://api.nimlo.net/api/records/SMP-61891",429,"application/json"],["DELETE","https://api.nimlo.net/api/records/SMP-61891",401,"application/json"],["POST","https://api.nimlo.net/api/login",200,"application/json"],["DELETE","https://api.nimlo.net/api/records/SMP-61891",204,"x-unknown"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.nimlo.net/config.json\",\n \"headers\": {\n \"host\": \"api.nimlo.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.nimlo.net\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.nimlo.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"823f03b2\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,58.8,23.5,11.8,0.0],"c3b":[23.5,94.1,70.6,0.0,23.5,17.6,0.0]},"fails":{"c3a":[6,6,6,1,10,6,10],"c3b":[10,4,6,10,10,10,10]}},{"id":"v3_terse_60_enum+rate_limit+refresh_rotation_samples","suite":"heal_v3_hint","tier":"B","title":"Fenvo Samples API","goal":"# Fenvo Samples API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.fenvo.co/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:samples","base_path","noise","login_format:json","case:heal3","mutation:add_drift_enum","mutation:add_rate_limit","mutation:add_refresh_rotation"],"n_requests":13,"requests":[["POST","https://api.fenvo.co/v2/sessions",200,"application/json"],["GET","https://api.fenvo.co/config.json",200,"application/json"],["GET","https://api.fenvo.co/v2/records",200,"application/json"],["GET","https://api.fenvo.co/v2/records/SMP-83758",200,"application/json"],["POST","https://api.fenvo.co/v2/records",201,"application/json"],["PATCH","https://api.fenvo.co/v2/records/SMP-23278",200,"application/json"],["POST","https://o900384202.ingest.sentry.io/api/900384202/envelope/?sentry_key=87820fc94438f49229f30c2e",200,"application/json"],["DELETE","https://api.fenvo.co/v2/records/SMP-90042",429,"application/json"],["DELETE","https://api.fenvo.co/v2/records/SMP-90042",401,"application/json"],["POST","https://api.fenvo.co/v2/auth/refresh",200,"application/json"],["DELETE","https://api.fenvo.co/v2/records/SMP-90042",204,"x-unknown"],["GET","https://www.googletagmanager.com/gtag/js?id=G-110170020",200,"application/javascript"],["GET","https://api.fenvo.co/manifest.json",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.fenvo.co/v2/sessions\",\n \"headers\": {\n \"host\": \"api.fenvo.co\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.fenvo.co\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.fenvo.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"token\\\":\\\"tok_dd9752d514b44b9161b5cb42\\\",\\\"refresh\\\":\\\"rtk_b0a0a5d37615cec477fabcb4\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[0.0,17.6,15.7,17.6,0.0,0.0,0.0],"c3b":[23.5,100.0,100.0,17.6,23.5,23.5,0.0]},"fails":{"c3a":[10,1,1,1,10,10,10],"c3b":[10,-1,-1,1,10,10,10]}},{"id":"v3_terse_61_rename+nest+moved_invoices","suite":"heal_v3_hint","tier":"B","title":"Nimik Invoices API","goal":"# Nimik Invoices API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.nimik.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:link_header","domain:invoices","base_path","noise","token_expiry","envelope","login_format:json","csrf_in:header","case:heal3","mutation:add_drift_rename","mutation:add_drift_nest","mutation:add_moved"],"n_requests":13,"requests":[["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-438591810&cid=438591810.438591810&en=page_view",204,"text/plain"],["POST","https://api.nimik.dev/v2/auth/login",200,"application/json"],["GET","https://api.nimik.dev/v2/records",200,"application/json"],["GET","https://api.nimik.dev/v2/records?page=2",200,"application/json"],["GET","https://api.nimik.dev/v2/data/records/INV-38704",200,"application/json"],["GET","https://api.nimik.dev/ping",200,"application/json"],["POST","https://api.nimik.dev/v2/records",201,"application/json"],["PATCH","https://api.nimik.dev/v2/data/records/INV-27613",401,"application/json"],["POST","https://api.nimik.dev/v2/auth/login",200,"application/json"],["PATCH","https://api.nimik.dev/v2/data/records/INV-27613",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/e8118b805a4a1731ebb649e7.woff2",200,"font/woff2"],["DELETE","https://api.nimik.dev/v2/data/records/INV-42193",204,"x-unknown"],["GET","https://api.nimik.dev/robots.txt",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.nimik.dev/v2/auth/login\",\n \"headers\": {\n \"host\": \"api.nimik.dev\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.nimik.dev\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.nimik.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_eb9e8e2a\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c3a":[17.6,17.6,17.6,17.6,58.8,17.6,17.6],"c3b":[100.0,100.0,100.0,0.0,100.0,100.0,17.6]},"fails":{"c3a":[6,6,6,6,11,6,6],"c3b":[-1,-1,-1,0,-1,-1,6]}},{"id":"v3_terse_62_cents+async_create+refresh_rotation_tickets","suite":"heal_v3_hint","tier":"B","title":"Zanrix Tickets API","goal":"# Zanrix Tickets API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.zanrix.net/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:offset","domain:tickets","base_path","noise","etag_update","login_format:json","case:heal3","mutation:add_drift_cents","mutation:add_async_create","mutation:add_refresh_rotation"],"n_requests":24,"requests":[["POST","https://api.zanrix.net/v2/auth/login",200,"application/json"],["GET","https://api.zanrix.net/v2/items",200,"application/json"],["GET","https://api.zanrix.net/v2/items?start=10",200,"application/json"],["GET","https://api.zanrix.net/__flags",200,"application/json"],["GET","https://api.zanrix.net/v2/items/TCK-55174",200,"application/json"],["POST","https://api.zanrix.net/v2/items",401,"application/json"],["POST","https://api.zanrix.net/v2/refresh",200,"application/json"],["POST","https://api.zanrix.net/v2/items",202,"application/json"],["GET","https://api.zanrix.net/v2/jobs/job_50fde776f4b4",200,"application/json"],["GET","https://api.zanrix.net/v2/jobs/job_50fde776f4b4",200,"application/json"],["GET","https://api.zanrix.net/v2/jobs/job_50fde776f4b4",401,"application/json"],["POST","https://api.zanrix.net/v2/refresh",200,"application/json"],["GET","https://api.zanrix.net/v2/jobs/job_50fde776f4b4",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-660370697",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=433795713&fmt=gif",204,"image/gif"],["GET","https://api.zanrix.net/v2/items/TCK-47452",200,"application/json"],["PATCH","https://api.zanrix.net/v2/items/TCK-47452",200,"application/json"],["DELETE","https://api.zanrix.net/v2/items/TCK-22140",401,"application/json"],["POST","https://api.zanrix.net/v2/refresh",200,"application/json"],["DELETE","https://api.zanrix.net/v2/items/TCK-22140",204,"x-unknown"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.zanrix.net/static/css/main.038da116.css",200,"text/css"],["GET","https://fonts.gstatic.com/s/inter/v13/cae4a35519ca1c50906c1c6b.woff2",200,"font/woff2"],["GET","https://api.zanrix.net/manifest.json",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.zanrix.net/v2/auth/login\",\n \"headers\": {\n \"host\": \"api.zanrix.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.zanrix.net\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.zanrix.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"access_token\\\":\\\"tok_baf5a43d6d191b92f26d0121\\\",\\\"refresh\\\":\\\"rtk_9f87c5a807592ec5bec9aa05\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c3a":[58.8,17.6,17.6,58.8,17.6,17.6,17.6],"c3b":[100.0,100.0,100.0,82.4,100.0,100.0,100.0]},"fails":{"c3a":[11,6,6,11,6,6,6],"c3b":[-1,-1,-1,11,-1,-1,-1]}},{"id":"v3_terse_63_epoch+nest+idempotency_key_bookings","suite":"heal_v3_hint","tier":"B","title":"Oriora Bookings API","goal":"# Oriora Bookings API: repair the client\n\nThe API behind this client has changed. `client_v1.py` is a correct client for the old version of the API.\nAgainst the new version it fails. Write `client.py`: the repaired client, one Python file that defines `class Client`\nand works with the new version.\n\n**Important:** the new API may also have changed its wire format (field names, units, value formats, nesting). Your methods must still return exactly what `client_v1.py` returns (the same field names, units and formats), and accept the same arguments. Translate between the new wire format and the old one in both directions: in responses and in request bodies and query parameters.\n\n## Files\n\n- `client_v1.py`: the client for the old version of the API.\n- `failure.txt`: what happened when `client_v1.py` ran against a practice server of the new version. It shows the\n first call that failed; other calls may fail too.\n- `session.har`: a short browser recording of a user session against the new version. It holds real requests and\n responses for the new version, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.oriora.co/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Keep the constructor, the method names and the arguments as `client_v1.py` has them.\n- Keep what each method returns as `client_v1.py` returns it: the same field names, value types and formats, whatever the new API sends.\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server of the new version with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:bookings","base_path","noise","case:heal3","mutation:add_drift_epoch","mutation:add_drift_nest","mutation:add_idempotency_key"],"n_requests":9,"requests":[["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-859360434&cid=859360434.859360434&en=page_view",204,"text/plain"],["GET","https://api.oriora.co/v1/items",200,"application/json"],["GET","https://api.oriora.co/v1/items?cursor=NTg3OWNkOGM6MTA",200,"application/json"],["GET","https://api.oriora.co/v1/items/BKG-34986",200,"application/json"],["POST","https://api.oriora.co/v1/items",201,"application/json"],["PATCH","https://api.oriora.co/v1/items/BKG-39885",200,"application/json"],["DELETE","https://api.oriora.co/v1/items/BKG-16440",204,"x-unknown"],["POST","https://o788133648.ingest.sentry.io/api/788133648/envelope/?sentry_key=59bfed2b49180a7314ce600d",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-196860769",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.oriora.co/v1/items\",\n \"headers\": {\n \"host\": \"api.oriora.co\",\n \"connection\": \"keep-alive\",\n \"x-api-token\": \"sk_04c2841f0d7bc9cfdc1a86f5\",\n \"origin\": \"https://app.oriora.co\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.oriora.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"items\\\":[{\\\"id\\\":\\\"BKG-16440\\\",\\\"created_at\\\":1767614280,\\\"guest\\\":\\\"Ravi Menon\\\",\\\"room\\\":\\\"Aurora\\\",\\\"starts_on\\\":\\\"2026-07-28\\\",\\\"nights\\\":10,\\\"party_size\\\":1,\\\"confirmed\\\":false,\\\"owner\\\":{\\\"name\\\":\\\"Elin Berg\\\",\\\"email\\\":\\\"sofia.duarte@corp.test\\\"}},{\\\"id\\\":\\\"BKG-22030\\\",\\\"created_at\\\":1767616200,\\\"guest\\\":\\\"Tomas Ito\\\",\\\"room\\\":\\\"Dune\\\",\\\"starts_on\\\":\\\"2026-09-29\\\",\\\"nights\\\":12,\\\"party_size\\\":3,\\\"confirmed\\\":true,\\\"owner\\\":{\\\"name\\\":\\\"Dev Patel\\\",\\\"email\\\":\\\"kofi.mensah@corp.test\\\"}},{\\\"id\\\":\\\"BKG-20622\\\",\\\"created_at\\\":1767623460,\\\"guest\\\":\\\"Tomas Ito\\\",\\\"room\\\":\\\"Ember\\\",\\\"starts_on\\\":\\\"2026-01-26\\\",\\\"nights\\\":12,\\\"party_size\\\":4,\\\"confirmed\\\":true,\\\"owner\\\":{\\\"name\\\":\\\"Lena Brandt\\\",\\\"email\\\":\\\"lena.brandt@example.org\\\"}},{\\\"id\\\":\\\"BKG-34986\\\",\\\"created_at\\\":1767627480,\\\"guest\\\":\\\"Tomas","results":{"c3a":[17.6,17.6,58.8,17.6,17.6,41.2,58.8],"c3b":[0.0,41.2,100.0,17.6,100.0,17.6,0.0]},"fails":{"c3a":[6,6,11,6,6,1,11],"c3b":[1,1,-1,6,-1,6,1]}},{"id":"bbci.co.uk","suite":"tier_a","tier":"A","title":"BBC iPlayer Business Layer","goal":"# BBC iPlayer Business Layer\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://ibl.api.bbci.co.uk/ibl/v1`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `get_sub_categories(self, category: str, lang: str) -> Any`: Get sub-categories\n- `get_programmes_by_category(self, category: str, lang: str, rights: str, availability: str, page: int, per_page: int) -> Any`: List all the programmes for a category.\n- `get_channels(self, lang: str, region: str | None = None) -> Any`: List all the channels.\n- `get_programme_by_pid(self, pid: str, rights: str, availability: str, mixin: list | None = None) -> Any`: Episode for a given pid.\n- `get_programmes_by_parent_pid(self, pid: str, rights: str, availability: str, initial_child_count: int) -> Any`: Programme for a given pid.\n- `get_regions(self, lang: str) -> Any`: List all regions\n- `search_suggest(self, q: str, lang: str, rights: str, availability: str) -> Any`: Search-suggest\n- `get_user_store_recommendations(self, identity_cookie: float) -> Any`: Get user store recommendations\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:apiKey","apikey_in:query","base_path","path_params","query_params","noise","partial_coverage"],"n_requests":60,"requests":[["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-597171536&cid=597171536.597171536&en=page_view",204,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://ibl.api.bbci.co.uk/ping",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/manifest.json",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/config.json",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-261594492&cid=261594492.261594492&en=page_view",204,"text/plain"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/categories/ttxkfc?lang=ga&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/sockjs-node/info",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-403959138.js?sv=6",200,"application/javascript"],["POST","https://o558981695.ingest.sentry.io/api/558981695/envelope/?sentry_key=52bb26b5e12a184afcf7b00b",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/categories/tqsi/programmes?lang=en&rights=web&availability=all&page=490&per_page=278&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/config.json",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/channels?lang=en&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-474269017.js?sv=6",200,"application/javascript"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/channels?lang=ga&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/favicon.ico",200,"image/x-icon"],["GET","https://ibl.api.bbci.co.uk/favicon.ico",200,"image/x-icon"],["GET","https://ibl.api.bbci.co.uk/manifest.json",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/channels?region=vphkawrgo&lang=gd&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/episodes/kcvsuqca?rights=mobile&availability=all&mixin=promotions&mixin=live&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=227557581&fmt=gif",204,"image/gif"],["GET","https://ibl.api.bbci.co.uk/manifest.json",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/episodes/pfpxjpdy?rights=tv&availability=available&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/static/css/main.4090409d.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/programmes/lymaetgl?rights=mobile&availability=available&initial_child_count=3&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/programmes/yizvsbcfif?rights=tv&availability=available&initial_child_count=1&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["POST","https://o916765797.ingest.sentry.io/api/916765797/envelope/?sentry_key=23522b10b66d2a392a64ceaa",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/static/js/main.08669716.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://www.googletagmanager.com/gtag/js?id=G-741808837",200,"application/javascript"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/regions?lang=pi&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/manifest.json",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/119992b0b9656c89ae0033fa.woff2",200,"font/woff2"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/regions?lang=en&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/ea75b169ad4ea2eeaeb09f10.woff2",200,"font/woff2"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-850981104&cid=850981104.850981104&en=page_view",204,"text/plain"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/regions?lang=ga&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/search-suggest?q=nfnu&lang=cy&rights=tv&availability=all&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://ibl.api.bbci.co.uk/",200,"text/html"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/search-suggest?q=omo&lang=cy&rights=mobile&availability=available&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/search-suggest?q=ipkhoriwam&lang=en&rights=mobile&availability=available&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/manifest.json",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/user/recommendations?identity_cookie=206.99&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/0a4506c8cab1d638f2036401.woff2",200,"font/woff2"],["GET","https://ibl.api.bbci.co.uk/",200,"text/html"],["GET","https://ibl.api.bbci.co.uk/__flags",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/user/recommendations?identity_cookie=84.38&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/sockjs-node/info",200,"application/json"],["GET","https://ibl.api.bbci.co.uk/static/media/logo.65c8a251.svg",200,"image/svg+xml"],["GET","https://px.ads.linkedin.com/collect?pid=206349099&fmt=gif",204,"image/gif"],["GET","https://ibl.api.bbci.co.uk/ibl/v1/user/recommendations?identity_cookie=851.26&api_key=sk_b319f00ef1cdab618e67db42",200,"application/json"],["POST","https://o158549337.ingest.sentry.io/api/158549337/envelope/?sentry_key=bf6d09cad0b2924d182d2575",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://ibl.api.bbci.co.uk/ping\",\n \"headers\": {\n \"host\": \"ibl.api.bbci.co.uk\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.bbci.co.uk\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.bbci.co.uk/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"status\\\":\\\"ok\\\",\\\"t\\\":869118763}\"\n }\n }\n}"},{"id":"conjur.local","suite":"tier_a","tier":"A","title":"Conjur","goal":"# Conjur\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `http://conjur.local`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `get_authenticators(self) -> Any`: Details about which authenticators are on the Conjur Server\n- `info(self) -> Any`: Basic information about the Conjur Enterprise server\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:basic","noise","partial_coverage"],"n_requests":40,"requests":[["GET","https://fonts.gstatic.com/s/inter/v13/bdfb18abbeea0234b7f6856d.woff2",200,"font/woff2"],["GET","http://conjur.local/robots.txt",200,"text/plain"],["GET","http://conjur.local/authenticators",200,"application/json"],["GET","http://conjur.local/authenticators",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","http://conjur.local/static/css/main.2446c8b5.css",200,"text/css"],["GET","http://conjur.local/authenticators",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","http://conjur.local/health",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-798759263&cid=798759263.798759263&en=page_view",204,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","http://conjur.local/health",200,"application/json"],["POST","https://o242908822.ingest.sentry.io/api/242908822/envelope/?sentry_key=56cfc39cbede1e2426c5cea7",200,"application/json"],["GET","http://conjur.local/health",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-643575009",200,"application/javascript"],["GET","http://conjur.local/info",200,"application/json"],["GET","http://conjur.local/static/js/main.8e8e251a.js",200,"application/javascript"],["GET","http://conjur.local/",200,"text/html"],["GET","http://conjur.local/info",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","http://conjur.local/info",200,"application/json"],["POST","https://o795234492.ingest.sentry.io/api/795234492/envelope/?sentry_key=6e561c60c461f5a72f2b0ea8",200,"application/json"],["POST","https://o653490808.ingest.sentry.io/api/653490808/envelope/?sentry_key=37ad916cd2c79f9cf2958ed1",200,"application/json"],["GET","http://conjur.local/robots.txt",200,"text/plain"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","http://conjur.local/remote_health/tbu",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","http://conjur.local/robots.txt",200,"text/plain"],["GET","http://conjur.local/sockjs-node/info",200,"application/json"],["GET","http://conjur.local/remote_health/gcdwlvnzo",200,"application/json"],["GET","http://conjur.local/robots.txt",200,"text/plain"],["GET","http://conjur.local/ping",200,"application/json"],["GET","http://conjur.local/remote_health/phi",200,"application/json"],["GET","http://conjur.local/static/js/main.ccb1e654.js",200,"application/javascript"],["GET","http://conjur.local/static/js/main.0720d593.js",200,"application/javascript"],["GET","http://conjur.local/config.json",200,"application/json"],["GET","http://conjur.local/__flags",200,"application/json"],["POST","https://o289222318.ingest.sentry.io/api/289222318/envelope/?sentry_key=1bcf3a614a1defcd8603daf3",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"http://conjur.local/authenticators\",\n \"headers\": {\n \"host\": \"conjur.local\",\n \"connection\": \"keep-alive\",\n \"authorization\": \"Basic dXNlcl9kMjk4Mzg4MDpwd19lODAwMGQ3OTg5OGQzN2Zi\",\n \"origin\": \"http://app.conjur.local\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"http://app.conjur.local/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"configured\\\":[\\\"lonawfwlxj\\\",\\\"jnxqmay\\\",\\\"llmqkyxair\\\"],\\\"enabled\\\":[\\\"jpeoquika\\\",\\\"shv\\\"],\\\"installed\\\":[\\\"duiwrmkqqx\\\"]}\"\n }\n }\n}"},{"id":"digitallocker.gov.in_authpartner","suite":"tier_a","tier":"A","title":"Authorized Partner API Specification","goal":"# Authorized Partner API Specification\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://betaapi.digitallocker.gov.in/public`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `get_authorization_code_id(self, response_type: str, redirect_uri: str, state: str, client_id: str | None = None, code_challenge: str | None = None, code_challenge_method: str | None = None, dl_flow: str | None = None, verified_mobile: int | None = None) -> Any`: Get Authorization Code\n- `get_device_code_id(self, body: dict | None = None) -> Any`: Get Device Code\n- `get_list_of_self_uploaded_documents(self) -> Any`: Get List of Self Uploaded Documents\n- `get_list_of_issued_documents_version1_id(self) -> Any`: Issued Documents\n- `get_list_of_self_uploaded_documents_id(self, id: str) -> Any`: Get List of Self Uploaded Documents\n- `getaccesstoken_id(self, body: dict) -> Any`: Get Access Token\n- `account_detail_api_id(self) -> Any`: Get User Details\n- `get_list_of_issued_documents_id(self) -> Any`: Issued Documents\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:bearer","base_path","path_params","query_params","json_body","noise","partial_coverage"],"n_requests":50,"requests":[["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://betaapi.digitallocker.gov.in/public/oauth2/1/authorize?client_id=pho&response_type=odimxt&redirect_uri=otqpqadki&state=wvgzypuqf&Code_challenge=euphgoxg&Code_challenge_method=hwmkjoquq",200,"application/json"],["GET","https://betaapi.digitallocker.gov.in/config.json",200,"application/json"],["GET","https://betaapi.digitallocker.gov.in/static/js/main.a7ef80c9.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=827053219&fmt=gif",204,"image/gif"],["GET","https://betaapi.digitallocker.gov.in/public/oauth2/1/authorize?response_type=efzgajng&redirect_uri=zpvcg&state=ezxxtzfh&Code_challenge=vaymm&dl_flow=iiby&Verified_mobile=47",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-202938337.js?sv=6",200,"application/javascript"],["POST","https://betaapi.digitallocker.gov.in/public/oauth2/1/code",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://betaapi.digitallocker.gov.in/public/oauth2/1/code",200,"application/json"],["GET","https://betaapi.digitallocker.gov.in/config.json",200,"application/json"],["GET","https://betaapi.digitallocker.gov.in/__flags",200,"application/json"],["POST","https://betaapi.digitallocker.gov.in/public/oauth2/1/code",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-490582704&cid=490582704.490582704&en=page_view",204,"text/plain"],["GET","https://betaapi.digitallocker.gov.in/",200,"text/html"],["GET","https://betaapi.digitallocker.gov.in/public/oauth2/1/files/",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-431154437&cid=431154437.431154437&en=page_view",204,"text/plain"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://o832941919.ingest.sentry.io/api/832941919/envelope/?sentry_key=595e0532232031c86171e78c",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://betaapi.digitallocker.gov.in/public/oauth2/1/files/issued",200,"application/json"],["GET","https://betaapi.digitallocker.gov.in/public/oauth2/1/files/issued",200,"application/json"],["GET","https://betaapi.digitallocker.gov.in/sockjs-node/info",200,"application/json"],["GET","https://betaapi.digitallocker.gov.in/public/oauth2/1/files/oiuaoie",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=72233079&fmt=gif",204,"image/gif"],["POST","https://betaapi.digitallocker.gov.in/public/oauth2/1/token",200,"application/json"],["GET","https://betaapi.digitallocker.gov.in/public/oauth2/1/user",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://betaapi.digitallocker.gov.in/public/oauth2/1/user",200,"application/json"],["POST","https://o725127519.ingest.sentry.io/api/725127519/envelope/?sentry_key=bd715a452bcffd0bc18c5d8d",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://betaapi.digitallocker.gov.in/manifest.json",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://betaapi.digitallocker.gov.in/public/oauth2/1/user",200,"application/json"],["GET","https://betaapi.digitallocker.gov.in/config.json",200,"application/json"],["GET","https://betaapi.digitallocker.gov.in/public/oauth2/2/files/issued",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://betaapi.digitallocker.gov.in/public/oauth2/2/files/issued",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://betaapi.digitallocker.gov.in/",200,"text/html"],["GET","https://fonts.gstatic.com/s/inter/v13/c1a2a60790238ecb4364de5b.woff2",200,"font/woff2"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.digitallocker.gov.in\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.digitallocker.gov.in/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}"},{"id":"elevenlabs.io","suite":"tier_a","tier":"A","title":"ElevenLabs API Documentation","goal":"# ElevenLabs API Documentation\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.elevenlabs.io`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `get_generated_items_v1_history_get(self) -> Any`: Get Generated Items\n- `delete_history_items_v1_history_delete_post(self, body: dict) -> Any`: Delete History Items\n- `delete_history_item_v1_history_history_item_id_delete(self, history_item_id: str) -> Any`: Delete History Item\n- `get_user_subscription_info_v1_user_subscription_get(self) -> Any`: Get User Subscription Info\n- `get_default_voice_settings_v1_voices_settings_default_get(self) -> Any`: Get Default Voice Settings.\n- `get_voice_v1_voices_voice_id_get(self, voice_id: str, with_settings: bool | None = None) -> Any`: Get Voice\n- `delete_voice_v1_voices_voice_id_delete(self, voice_id: str) -> Any`: Delete Voice\n- `delete_sample_v1_voices_voice_id_samples_sample_id_delete(self, voice_id: str, sample_id: str) -> Any`: Delete Sample\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:none","path_params","query_params","json_body","noise","partial_coverage"],"n_requests":57,"requests":[["GET","https://px.ads.linkedin.com/collect?pid=493311920&fmt=gif",204,"image/gif"],["GET","https://api.elevenlabs.io/__flags",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=588576837&fmt=gif",204,"image/gif"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://static.hotjar.com/c/hotjar-103204517.js?sv=6",200,"application/javascript"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://o712635786.ingest.sentry.io/api/712635786/envelope/?sentry_key=38777777997f41a987f1713b",200,"application/json"],["GET","https://api.elevenlabs.io/ping",200,"application/json"],["GET","https://api.elevenlabs.io/v1/history",200,"application/json"],["GET","https://api.elevenlabs.io/static/media/logo.36459af6.svg",200,"image/svg+xml"],["GET","https://api.elevenlabs.io/v1/history",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-276157672.js?sv=6",200,"application/javascript"],["GET","https://api.elevenlabs.io/v1/history",200,"application/json"],["GET","https://api.elevenlabs.io/robots.txt",200,"text/plain"],["GET","https://api.elevenlabs.io/favicon.ico",200,"image/x-icon"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.elevenlabs.io/manifest.json",200,"application/json"],["POST","https://api.elevenlabs.io/v1/history/delete",200,"application/json"],["GET","https://api.elevenlabs.io/__flags",200,"application/json"],["POST","https://api.elevenlabs.io/v1/history/delete",200,"application/json"],["DELETE","https://api.elevenlabs.io/v1/history/hzy",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-346422397&cid=346422397.346422397&en=page_view",204,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-788255868&cid=788255868.788255868&en=page_view",204,"text/plain"],["DELETE","https://api.elevenlabs.io/v1/history/wrfnrmy",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["DELETE","https://api.elevenlabs.io/v1/history/zdxoawys",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.elevenlabs.io/v1/user/subscription",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.elevenlabs.io/v1/voices/settings/default",200,"application/json"],["GET","https://api.elevenlabs.io/v1/voices/settings/default",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.elevenlabs.io/v1/voices/puxxaamdwx",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://o734277883.ingest.sentry.io/api/734277883/envelope/?sentry_key=d321981241bbd19b4361e1b3",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-423548677",200,"application/javascript"],["GET","https://api.elevenlabs.io/v1/voices/saqbsa?with_settings=false",200,"application/json"],["GET","https://api.elevenlabs.io/",200,"text/html"],["GET","https://api.elevenlabs.io/v1/voices/wzhzpfu?with_settings=false",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/12f5d6e0618c3f407c221062.woff2",200,"font/woff2"],["DELETE","https://api.elevenlabs.io/v1/voices/jhgirtm",200,"application/json"],["GET","https://api.elevenlabs.io/ping",200,"application/json"],["GET","https://api.elevenlabs.io/static/css/main.930ba771.css",200,"text/css"],["POST","https://api.segment.io/v1/t",200,"application/json"],["DELETE","https://api.elevenlabs.io/v1/voices/vlmqg/samples/ysu",200,"application/json"],["GET","https://api.elevenlabs.io/static/css/main.e94a5939.css",200,"text/css"],["GET","https://api.elevenlabs.io/config.json",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-535476383&cid=535476383.535476383&en=page_view",204,"text/plain"],["DELETE","https://api.elevenlabs.io/v1/voices/qkufwex/samples/ervrwyc",200,"application/json"],["GET","https://api.elevenlabs.io/sockjs-node/info",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.elevenlabs.io/__flags\",\n \"headers\": {\n \"host\": \"api.elevenlabs.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.elevenlabs.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.elevenlabs.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"d6e3eeb6\\\"}\"\n }\n }\n}"},{"id":"elmah.io","suite":"tier_a","tier":"A","title":"elmah.io API","goal":"# elmah.io API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://elmah.io`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `deployments_get_all(self) -> Any`: Fetch a list of deployments.\n- `deployments_create(self, body: dict | None = None) -> Any`: Create a new deployment.\n- `logs_get_all(self) -> Any`: Fetch a list of logs.\n- `logs_create(self, body: dict | None = None) -> Any`: Create a new log.\n- `logs_get(self, id: str) -> Any`: Fetch a log by its ID.\n- `logs_diagnose(self, id: str) -> Any`: Help diagnose logging problems.\n- `messages_get_all(self, log_id: str, page_index: int | None = None, page_size: int | None = None, query: str | None = None, from_: str | None = None, to: str | None = None, include_headers: bool | None = None) -> Any`: Fetch messages from a log.\n- `messages_get(self, id: str, log_id: str) -> Any`: Fetch a message by its ID.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:apiKey","apikey_in:query","path_params","query_params","json_body","noise","partial_coverage"],"n_requests":50,"requests":[["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-139564184&cid=139564184.139564184&en=page_view",204,"text/plain"],["GET","https://elmah.io/v3/deployments?api_key=sk_6f4d0de8d0e9326f0894bcdd",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://elmah.io/v3/deployments?api_key=sk_6f4d0de8d0e9326f0894bcdd",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/9b98a65b87fbb905d17f08b4/analytics.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-422556053&cid=422556053.422556053&en=page_view",204,"text/plain"],["GET","https://elmah.io/v3/deployments?api_key=sk_6f4d0de8d0e9326f0894bcdd",200,"application/json"],["POST","https://o181399259.ingest.sentry.io/api/181399259/envelope/?sentry_key=7e25a43d05709eeeebc07276",200,"application/json"],["POST","https://elmah.io/v3/deployments?api_key=sk_6f4d0de8d0e9326f0894bcdd",201,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://fonts.gstatic.com/s/inter/v13/1e7b9240717c3dfd7169d4f2.woff2",200,"font/woff2"],["GET","https://elmah.io/config.json",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://elmah.io/v3/logs?api_key=sk_6f4d0de8d0e9326f0894bcdd",200,"application/json"],["GET","https://elmah.io/__flags",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://elmah.io/__flags",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://elmah.io/v3/logs?api_key=sk_6f4d0de8d0e9326f0894bcdd",200,"application/json"],["GET","https://elmah.io/static/css/main.6a172ed1.css",200,"text/css"],["GET","https://elmah.io/static/js/main.a562c876.js",200,"application/javascript"],["POST","https://elmah.io/v3/logs?api_key=sk_6f4d0de8d0e9326f0894bcdd",201,"application/json"],["GET","https://elmah.io/static/css/main.82b98112.css",200,"text/css"],["POST","https://elmah.io/v3/logs?api_key=sk_6f4d0de8d0e9326f0894bcdd",201,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://elmah.io/",200,"text/html"],["GET","https://px.ads.linkedin.com/collect?pid=456973110&fmt=gif",204,"image/gif"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-221491007&cid=221491007.221491007&en=page_view",204,"text/plain"],["GET","https://elmah.io/v3/logs/xdxyde?api_key=sk_6f4d0de8d0e9326f0894bcdd",200,"application/json"],["GET","https://elmah.io/v3/logs/gpkf?api_key=sk_6f4d0de8d0e9326f0894bcdd",200,"application/json"],["POST","https://o890839854.ingest.sentry.io/api/890839854/envelope/?sentry_key=4a98b23fe34d4dc3d3e824c8",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://elmah.io/v3/logs/gqyrasjyyn/_diagnose?api_key=sk_6f4d0de8d0e9326f0894bcdd",200,"application/json"],["GET","https://elmah.io/robots.txt",200,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=36086401&fmt=gif",204,"image/gif"],["GET","https://elmah.io/static/media/logo.fae3a571.svg",200,"image/svg+xml"],["GET","https://elmah.io/v3/logs/ndcdwnh/_diagnose?api_key=sk_6f4d0de8d0e9326f0894bcdd",200,"application/json"],["GET","https://elmah.io/v3/logs/esplhwd/_diagnose?api_key=sk_6f4d0de8d0e9326f0894bcdd",200,"application/json"],["GET","https://elmah.io/static/css/main.af3703db.css",200,"text/css"],["GET","https://elmah.io/sockjs-node/info",200,"application/json"],["GET","https://elmah.io/v3/messages/dmmpfm?pageIndex=697&pageSize=214&query=qnctddye&from=2025-05-06T02%3A52%3A06Z&to=2025-06-17T06%3A50%3A54Z&includeHeaders=false&api_key=sk_6f4d0de8d0e9326f0894bcdd",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-105620945.js?sv=6",200,"application/javascript"],["GET","https://elmah.io/",200,"text/html"],["GET","https://elmah.io/v3/messages/kygva/urplrqbr?api_key=sk_6f4d0de8d0e9326f0894bcdd",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://elmah.io/sockjs-node/info",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/b7b78973ffa3500352cd8353/analytics.min.js",200,"application/javascript"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.elmah.io\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.elmah.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}"},{"id":"formapi.io","suite":"tier_a","tier":"A","title":"API v1","goal":"# API v1\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.docspring.com/api/v1`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `get_combined_submission(self, combined_submission_id: str) -> Any`: Check the status of a combined submission (merged PDFs)\n- `create_folder(self, body: dict) -> Any`: Create a folder\n- `delete_folder(self, folder_id: str) -> Any`: Delete a folder\n- `move_folder_to_folder(self, folder_id: str, body: dict) -> Any`: Move a folder\n- `list_submissions(self, cursor: str | None = None, limit: float | None = None, created_after: str | None = None, created_before: str | None = None, type: str | None = None, include_data: bool | None = None) -> Any`: List all submissions\n- `batch_generate_pdfs(self, body: dict) -> Any`: Generates multiple PDFs\n- `get_templates_template_id_submissions(self, template_id: str, cursor: str | None = None, limit: float | None = None, created_after: str | None = None, created_before: str | None = None, type: str | None = None, include_data: bool | None = None) -> Any`: List all submissions for a given template\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:basic","base_path","path_params","query_params","json_body","noise","partial_coverage"],"n_requests":50,"requests":[["POST","https://o752486808.ingest.sentry.io/api/752486808/envelope/?sentry_key=0538fde1b17760f9ed435ecc",200,"application/json"],["GET","https://api.docspring.com/manifest.json",200,"application/json"],["GET","https://api.docspring.com/manifest.json",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.docspring.com/api/v1/authentication",200,"application/json"],["GET","https://api.docspring.com/sockjs-node/info",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-983372770&cid=983372770.983372770&en=page_view",204,"text/plain"],["GET","https://api.docspring.com/manifest.json",200,"application/json"],["GET","https://api.docspring.com/api/v1/authentication",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-149387380.js?sv=6",200,"application/javascript"],["GET","https://api.docspring.com/",200,"text/html"],["GET","https://api.docspring.com/api/v1/combined_submissions/subo",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=724165353&fmt=gif",204,"image/gif"],["GET","https://api.docspring.com/static/js/main.373eb7c0.js",200,"application/javascript"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.docspring.com/api/v1/combined_submissions/pfpf",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-523734447.js?sv=6",200,"application/javascript"],["POST","https://api.docspring.com/api/v1/folders/",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/25d4468a955bcf161ca54aa2.woff2",200,"font/woff2"],["POST","https://api.docspring.com/api/v1/folders/",200,"application/json"],["POST","https://api.docspring.com/api/v1/folders/",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-149707656.js?sv=6",200,"application/javascript"],["GET","https://api.docspring.com/config.json",200,"application/json"],["GET","https://api.docspring.com/robots.txt",200,"text/plain"],["GET","https://api.docspring.com/static/media/logo.aad0986f.svg",200,"image/svg+xml"],["GET","https://api.docspring.com/static/css/main.7d29cd24.css",200,"text/css"],["GET","https://api.docspring.com/config.json",200,"application/json"],["GET","https://api.docspring.com/ping",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["DELETE","https://api.docspring.com/api/v1/folders/tqoxq",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/f40fc6dedcf7085429829dff/analytics.min.js",200,"application/javascript"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["DELETE","https://api.docspring.com/api/v1/folders/uqc",200,"application/json"],["GET","https://api.docspring.com/favicon.ico",200,"image/x-icon"],["DELETE","https://api.docspring.com/api/v1/folders/zupydbryol",200,"application/json"],["POST","https://api.docspring.com/api/v1/folders/qrb/move",200,"application/json"],["GET","https://api.docspring.com/favicon.ico",200,"image/x-icon"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://fonts.gstatic.com/s/inter/v13/4a8c6a3a4780c40a0fcef133.woff2",200,"font/woff2"],["POST","https://o738217766.ingest.sentry.io/api/738217766/envelope/?sentry_key=f5561572bb7e04aa053911f3",200,"application/json"],["GET","https://api.docspring.com/",200,"text/html"],["GET","https://api.docspring.com/api/v1/submissions?cursor=uxdwp&limit=516.47&created_after=fileebgph&created_before=dmngoo&type=bgyl&include_data=false",200,"application/json"],["POST","https://api.docspring.com/api/v1/submissions/batches",200,"application/json"],["GET","https://api.docspring.com/__flags",200,"application/json"],["POST","https://api.docspring.com/api/v1/submissions/batches",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.docspring.com/robots.txt",200,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-880550720&cid=880550720.880550720&en=page_view",204,"text/plain"],["GET","https://api.docspring.com/api/v1/templates/auy/submissions?cursor=xbbtow&limit=668.78&created_after=dvzv&created_before=qri&type=cinhfh&include_data=true",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-109813905",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o752486808.ingest.sentry.io/api/752486808/envelope/?sentry_key=0538fde1b17760f9ed435ecc\",\n \"headers\": {\n \"host\": \"o752486808.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.docspring.com\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.docspring.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"1d99a9137c3ba2c0a5c812bd\\\"}\"\n }\n }\n}"},{"id":"goog.io","suite":"tier_a","tier":"A","title":"goog.io | Unoffical Google Search API","goal":"# goog.io | Unoffical Google Search API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.goog.io`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `get_the_status_of_the_api_service(self) -> Any`: Status\n- `crawl(self, query: str) -> Any`: Crawl\n- `images(self, query: str) -> Any`: Images\n- `news(self, query: str) -> Any`: News\n- `search(self, query: str) -> Any`: Search\n- `serp(self, body: dict) -> Any`: SERP\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:apiKey","apikey_in:header","path_params","json_body","noise"],"n_requests":30,"requests":[["GET","https://cdn.segment.com/analytics.js/v1/03274ec6bc989e68ed82ee36/analytics.min.js",200,"application/javascript"],["GET","https://api.goog.io/ping",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/736e53188d7897d679325998.woff2",200,"font/woff2"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.goog.io/__flags",200,"application/json"],["GET","https://api.goog.io/",200,"text/html"],["GET","https://api.goog.io/",200,"application/json"],["GET","https://api.goog.io/v1/crawl/ayvzkbqra",200,"application/json"],["GET","https://api.goog.io/static/media/logo.8ec1e189.svg",200,"image/svg+xml"],["GET","https://api.goog.io/v1/images/pmlinyrp",200,"application/json"],["GET","https://api.goog.io/",200,"text/html"],["GET","https://api.goog.io/v1/news/jhu",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=49384317&fmt=gif",204,"image/gif"],["GET","https://px.ads.linkedin.com/collect?pid=529919689&fmt=gif",204,"image/gif"],["GET","https://api.goog.io/v1/news/grtvfjkk",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.goog.io/static/media/logo.24d5a43e.svg",200,"image/svg+xml"],["GET","https://api.goog.io/v1/search/zfdfmh",200,"application/json"],["GET","https://api.goog.io/v1/search/zuu",200,"application/json"],["POST","https://api.goog.io/v1/serp/",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/437171d054b6e32a466abfa3/analytics.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-680735010&cid=680735010.680735010&en=page_view",204,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.goog.io/v1/serp/",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-821554315",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=305474179&fmt=gif",204,"image/gif"],["GET","https://api.goog.io/sockjs-node/info",200,"application/json"],["GET","https://api.goog.io/static/js/main.15de7016.js",200,"application/javascript"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.goog.io/ping\",\n \"headers\": {\n \"host\": \"api.goog.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.goog.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.goog.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"status\\\":\\\"ok\\\",\\\"t\\\":546319355}\"\n }\n }\n}"},{"id":"google.com","suite":"tier_a","tier":"A","title":"Travel Partner API","goal":"# Travel Partner API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://travelpartner.googleapis.com`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `travelpartner_accounts_reconciliation_reports_get(self, name: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None, include_matched_prices: bool | None = None, include_non_scoring: bool | None = None, include_pixels: bool | None = None) -> Any`: Returns a reconciliation report.\n- `travelpartner_accounts_brands_list(self, parent: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None) -> Any`: Returns the brands for a partner account.\n- `travelpartner_accounts_hotel_views_list(self, parent: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None, filter: str | None = None, page_size: int | None = None, page_token: str | None = None) -> Any`: Returns the list of hotel views.\n- `travelpartner_accounts_icons_list(self, parent: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None) -> Any`: Returns the `Icon`s for a partner account.\n- `travelpartner_accounts_price_accuracy_views_list(self, parent: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None) -> Any`: Lists the available price accuracy views.\n- `travelpartner_accounts_price_accuracy_views_summarize(self, parent: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None) -> Any`: Returns the price accuracy summary.\n- `travelpartner_accounts_price_coverage_views_get_latest(self, parent: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None) -> Any`: Returns the latest price coverage view in full detail.\n- `travelpartner_accounts_reconciliation_reports_validate(self, parent: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None, body: dict | None = None) -> Any`: Validates a reconciliation report.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:none","path_params","query_params","json_body","noise","partial_coverage"],"n_requests":47,"requests":[["GET","https://travelpartner.googleapis.com/favicon.ico",200,"image/x-icon"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://o170497579.ingest.sentry.io/api/170497579/envelope/?sentry_key=1bf60af250678bb556c33ff6",200,"application/json"],["GET","https://travelpartner.googleapis.com/config.json",200,"application/json"],["GET","https://travelpartner.googleapis.com/static/js/main.2b71d84f.js",200,"application/javascript"],["GET","https://travelpartner.googleapis.com/v3/kslqt?%24.xgafv=2&access_token=poatcxik&alt=media&callback=jqj&fields=cckekwwbcw&key=nyhbmqiwib&oauth_token=ybg&prettyPrint=false"aUser=qfr&upload_protocol=ldzv&uploadType=zlk&includeMatchedPrices=true&includeNonScoring=false&includePixels=true",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-11392451&cid=11392451.11392451&en=page_view",204,"text/plain"],["GET","https://travelpartner.googleapis.com/v3/hky/brands?%24.xgafv=1&access_token=zvyom&alt=media&callback=doz&fields=ufeooukf&key=ctkyemlik&oauth_token=bphwewqhq&prettyPrint=false"aUser=zbin&upload_protocol=gbxuoc&uploadType=gbsgdaffy",200,"application/json"],["GET","https://travelpartner.googleapis.com/robots.txt",200,"text/plain"],["GET","https://travelpartner.googleapis.com/v3/omcb/hotelViews?fields=fnv&key=vcabgpoaw&oauth_token=qllayg&uploadType=xdvmlmk&pageSize=705",200,"application/json"],["GET","https://travelpartner.googleapis.com/v3/zizng/hotelViews?%24.xgafv=2&access_token=yjtwxqbobi&alt=json&callback=cvcxq&filter=votrm&pageSize=901",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://travelpartner.googleapis.com/config.json",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-133834753",200,"application/javascript"],["GET","https://travelpartner.googleapis.com/v3/balg/hotelViews?callback=xvysctbd&fields=kdgsspeh&key=lwzputowwh&oauth_token=ducy&prettyPrint=true"aUser=yotvuplbf&upload_protocol=gpnxgkao&filter=zkicq&pageSize=979&pageToken=wwyaocwt",200,"application/json"],["GET","https://travelpartner.googleapis.com/v3/gdlsn/icons?%24.xgafv=1&access_token=rqaid&alt=media&callback=iuhap&fields=whigrl&key=zzvrt&oauth_token=mebthiskpy&prettyPrint=false"aUser=tlvppqy&upload_protocol=jjtm&uploadType=psrwbna",200,"application/json"],["GET","https://travelpartner.googleapis.com/v3/gvek/priceAccuracyViews?%24.xgafv=1&access_token=gxcql&alt=json&callback=xtgnyom&fields=yclcq&key=mvtifv&oauth_token=mqbzkj&prettyPrint=true"aUser=ksqqwapw&upload_protocol=titkb&uploadType=erxft",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-896532416&cid=896532416.896532416&en=page_view",204,"text/plain"],["GET","https://www.googletagmanager.com/gtag/js?id=G-232650064",200,"application/javascript"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://travelpartner.googleapis.com/favicon.ico",200,"image/x-icon"],["GET","https://travelpartner.googleapis.com/ping",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://travelpartner.googleapis.com/v3/psoyw/priceAccuracyViews:summarize?callback=cqycnupyr&key=moincg"aUser=hsldc",200,"application/json"],["GET","https://travelpartner.googleapis.com/__flags",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://travelpartner.googleapis.com/v3/ycsl/priceAccuracyViews:summarize?access_token=huzn&oauth_token=ouxdd&upload_protocol=tueodykoju",200,"application/json"],["GET","https://travelpartner.googleapis.com/favicon.ico",200,"image/x-icon"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://www.googletagmanager.com/gtag/js?id=G-179854330",200,"application/javascript"],["GET","https://travelpartner.googleapis.com/ping",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-304904098&cid=304904098.304904098&en=page_view",204,"text/plain"],["GET","https://travelpartner.googleapis.com/v3/fciumzeyhy/priceAccuracyViews:summarize?%24.xgafv=1&alt=proto&callback=ihkujejm&fields=vlkfpwntm&prettyPrint=true"aUser=rxchxp&upload_protocol=gvvxuylk&uploadType=gtlm",200,"application/json"],["GET","https://travelpartner.googleapis.com/v3/flolotnorw/priceCoverageViews:latest?%24.xgafv=2&access_token=pwilvbudwj&alt=media&key=iofoaobpwi&oauth_token=bmaefipho&upload_protocol=kipwufnuek&uploadType=fuixv",200,"application/json"],["GET","https://travelpartner.googleapis.com/static/css/main.c42fe8fd.css",200,"text/css"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://travelpartner.googleapis.com/manifest.json",200,"application/json"],["GET","https://travelpartner.googleapis.com/v3/exgexry/priceCoverageViews:latest?access_token=obzyqhmvxw&oauth_token=fhcozq"aUser=qqpxbu&uploadType=srm",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://travelpartner.googleapis.com/v3/lpsx/priceCoverageViews:latest?%24.xgafv=1&alt=json&callback=cypzcf&fields=kwcjqrim&oauth_token=gxitkfaeb&prettyPrint=false"aUser=kzmzx&uploadType=bqi",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-183295012&cid=183295012.183295012&en=page_view",204,"text/plain"],["POST","https://travelpartner.googleapis.com/v3/mfdvsbfhlg/reconciliationReports:validate?%24.xgafv=2&access_token=fdpe&alt=json&callback=hvs&fields=fggjmfr&key=hyuy&oauth_token=oipyuzq&prettyPrint=false"aUser=xrfyenuig&upload_protocol=sqngxenxsz&uploadType=mwtfpgdmus",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://travelpartner.googleapis.com/manifest.json",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.googleapis.com\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.googleapis.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}"},{"id":"googleapis.com_firebasedatabase","suite":"tier_a","tier":"A","title":"Firebase Realtime Database API","goal":"# Firebase Realtime Database API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://firebasedatabase.googleapis.com`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `firebasedatabase_projects_locations_instances_get(self, name: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None) -> Any`: Gets the DatabaseInstance identified by the specified resource name.\n- `firebasedatabase_projects_locations_instances_delete(self, name: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None) -> Any`: Marks a DatabaseInstance to be deleted. The DatabaseInstance will be set to the DELETED state for 20 days, and will be p\n- `firebasedatabase_projects_locations_instances_disable(self, name: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None, body: dict | None = None) -> Any`: Disables a DatabaseInstance. The database can be re-enabled later using ReenableDatabaseInstance. When a database is dis\n- `firebasedatabase_projects_locations_instances_reenable(self, name: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None, body: dict | None = None) -> Any`: Enables a DatabaseInstance. The database must have been disabled previously using DisableDatabaseInstance. The state of \n- `firebasedatabase_projects_locations_instances_undelete(self, name: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None, body: dict | None = None) -> Any`: Restores a DatabaseInstance that was previously marked to be deleted. After the delete method is used, DatabaseInstances\n- `firebasedatabase_projects_locations_instances_list(self, parent: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None, page_size: int | None = None, page_token: str | None = None, show_deleted: bool | None = None) -> Any`: Lists each DatabaseInstance associated with the specified parent project. The list items are returned in no particular o\n- `firebasedatabase_projects_locations_instances_create(self, parent: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None, database_id: str | None = None, validate_only: bool | None = None, body: dict | None = None) -> Any`: Requests that a new DatabaseInstance be created. The state of a successfully created DatabaseInstance is ACTIVE. Only av\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:bearer","path_params","query_params","json_body","noise"],"n_requests":63,"requests":[["GET","https://firebasedatabase.googleapis.com/favicon.ico",200,"image/x-icon"],["GET","https://firebasedatabase.googleapis.com/manifest.json",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/",200,"text/html"],["GET","https://firebasedatabase.googleapis.com/ping",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/ping",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/static/media/logo.d4e3a10c.svg",200,"image/svg+xml"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://firebasedatabase.googleapis.com/ping",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/manifest.json",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/v1beta/fwjpz?alt=json&key=vdgue&oauth_token=fnovahcu&prettyPrint=true&upload_protocol=mih&uploadType=wxfawyorer",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/v1beta/cso?access_token=cgmqtx&alt=json&callback=vnqzh&fields=ovnezzjls&key=tho&oauth_token=dnsfysqtwo"aUser=vll&upload_protocol=yklrrpt&uploadType=knqsw",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/v1beta/llws?%24.xgafv=2&access_token=akmorz&key=obtp&upload_protocol=aujde",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/sockjs-node/info",200,"application/json"],["DELETE","https://firebasedatabase.googleapis.com/v1beta/jgnwpjq?%24.xgafv=1&access_token=kezr&alt=proto&callback=idnlx"aUser=qmc&uploadType=zhddhrmfnh",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["DELETE","https://firebasedatabase.googleapis.com/v1beta/hcj?%24.xgafv=1&access_token=hdjwv&alt=proto&callback=mycc&fields=kfcq&key=zphisaiftg&oauth_token=gafnhv&prettyPrint=false&upload_protocol=regcxff&uploadType=gkfdc",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=545803653&fmt=gif",204,"image/gif"],["GET","https://firebasedatabase.googleapis.com/config.json",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/static/css/main.b1532976.css",200,"text/css"],["POST","https://firebasedatabase.googleapis.com/v1beta/ozxheme:disable?alt=proto&key=rzujsnh&oauth_token=hcjlpbpqlt"aUser=elmt&upload_protocol=bgdfp&uploadType=arae",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/sockjs-node/info",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/static/js/main.bf9fecf2.js",200,"application/javascript"],["POST","https://firebasedatabase.googleapis.com/v1beta/uvq:disable?alt=json&callback=pcltvp&fields=lppbni&prettyPrint=true&upload_protocol=knnzqnn&uploadType=nllztgn",200,"application/json"],["POST","https://firebasedatabase.googleapis.com/v1beta/ahsbb:disable?%24.xgafv=2&access_token=alxudogxc&alt=proto&fields=wdvwv&key=przgkog&oauth_token=ngipyh&prettyPrint=true"aUser=lwy&upload_protocol=ciibkrwrrj",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/__flags",200,"application/json"],["POST","https://o763230751.ingest.sentry.io/api/763230751/envelope/?sentry_key=f4245221dd6332030d4c0489",200,"application/json"],["POST","https://firebasedatabase.googleapis.com/v1beta/lvqnz:reenable?alt=proto&callback=bvda&key=ibgmykqt&oauth_token=ptnxqdtif"aUser=ksy&upload_protocol=drceamxknh&uploadType=ajsbn",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/",200,"text/html"],["GET","https://cdn.segment.com/analytics.js/v1/85de6ff27c3e0be49f6476a7/analytics.min.js",200,"application/javascript"],["POST","https://firebasedatabase.googleapis.com/v1beta/mketn:reenable?%24.xgafv=2&access_token=msxvvvxx&alt=json&fields=nkksofpoyg&oauth_token=dfzaqy&prettyPrint=true"aUser=atouds&uploadType=mkoeruuoc",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-529512731&cid=529512731.529512731&en=page_view",204,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/favicon.ico",200,"image/x-icon"],["POST","https://firebasedatabase.googleapis.com/v1beta/ytmahp:undelete?access_token=muxajy&alt=proto&key=dgxnukgg&upload_protocol=klhzyyhbs&uploadType=qqjbmagys",200,"application/json"],["POST","https://firebasedatabase.googleapis.com/v1beta/xdmvozawqx:undelete?%24.xgafv=2&callback=scec&fields=qxx&key=xupbmmecp&prettyPrint=true&uploadType=uatatw",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-865784897.js?sv=6",200,"application/javascript"],["POST","https://firebasedatabase.googleapis.com/v1beta/gmt:undelete?%24.xgafv=2&alt=media&fields=qewocovr&key=qzthqwqb&oauth_token=duesikirgn&prettyPrint=true"aUser=oowxd&uploadType=hgrn",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/static/css/main.381313b6.css",200,"text/css"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://firebasedatabase.googleapis.com/v1beta/cryn/instances?fields=koqcyf&prettyPrint=true&showDeleted=true",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://firebasedatabase.googleapis.com/v1beta/pmf/instances?alt=json&callback=igryanxpcz&fields=smweskmon&oauth_token=ycvmxigbm&prettyPrint=true&upload_protocol=tyfxv&uploadType=cbp&pageSize=312&pageToken=lpblrni&showDeleted=false",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://firebasedatabase.googleapis.com/v1beta/bifocya/instances?%24.xgafv=2&access_token=qvbp&fields=asqjpciecf&key=mpfxxe"aUser=oecjoy&pageSize=644&pageToken=qph",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/static/js/main.cfb7d036.js",200,"application/javascript"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://o632097409.ingest.sentry.io/api/632097409/envelope/?sentry_key=cbee3855246b50d7e6afdded",200,"application/json"],["POST","https://firebasedatabase.googleapis.com/v1beta/ucphkrw/instances?callback=qijgveghbs&key=xcxu&oauth_token=pqkqi&prettyPrint=false&upload_protocol=vltaentibq&databaseId=cpenellf",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://o319039069.ingest.sentry.io/api/319039069/envelope/?sentry_key=625cfbe5cf8d4a127526986d",200,"application/json"],["GET","https://firebasedatabase.googleapis.com/static/js/main.2e2ef0b7.js",200,"application/javascript"],["POST","https://firebasedatabase.googleapis.com/v1beta/juol/instances?%24.xgafv=1&access_token=llrgxx&alt=media&callback=wpshcy&fields=soghtdnade&key=jmsqtdt&oauth_token=ubbp&prettyPrint=true&upload_protocol=ahprabmsez&uploadType=iauabyhft",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=114313887&fmt=gif",204,"image/gif"],["GET","https://px.ads.linkedin.com/collect?pid=650777269&fmt=gif",204,"image/gif"],["POST","https://o496536526.ingest.sentry.io/api/496536526/envelope/?sentry_key=e1f0782d46fb8a2fe072aa04",200,"application/json"],["POST","https://firebasedatabase.googleapis.com/v1beta/hgxtfkfax/instances?%24.xgafv=1&access_token=ydfqzib&callback=eoth&oauth_token=vel"aUser=jrrbee&upload_protocol=thkbpyqep&uploadType=gbnbnh&databaseId=hts&validateOnly=false",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://firebasedatabase.googleapis.com/manifest.json\",\n \"headers\": {\n \"host\": \"firebasedatabase.googleapis.com\",\n \"connection\": \"keep-alive\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"manifest\",\n \"referer\": \"https://app.googleapis.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"short_name\\\":\\\"App\\\",\\\"start_url\\\":\\\".\\\",\\\"display\\\":\\\"standalone\\\",\\\"icons\\\":[]}\"\n }\n }\n}"},{"id":"googleapis.com_pubsub","suite":"tier_a","tier":"A","title":"Cloud Pub/Sub API","goal":"# Cloud Pub/Sub API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://pubsub.googleapis.com`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `pubsub_projects_topics_create(self, name: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None, body: dict | None = None) -> Any`: Creates the given topic with the given name.\n- `pubsub_projects_subscriptions_list(self, project: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None, page_size: int | None = None, page_token: str | None = None) -> Any`: Lists matching subscriptions.\n- `pubsub_projects_topics_list(self, project: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None, page_size: int | None = None, page_token: str | None = None) -> Any`: Lists matching topics.\n- `pubsub_projects_topics_publish(self, topic: str, xgafv: str | None = None, access_token: str | None = None, alt: str | None = None, callback: str | None = None, fields: str | None = None, key: str | None = None, oauth_token: str | None = None, pretty_print: bool | None = None, quota_user: str | None = None, upload_protocol: str | None = None, upload_type: str | None = None, body: dict | None = None) -> Any`: Adds one or more messages to the topic. Returns `NOT_FOUND` if the topic does not exist. The message payload must not be\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:bearer","path_params","query_params","json_body","noise","partial_coverage"],"n_requests":63,"requests":[["GET","https://pubsub.googleapis.com/config.json",200,"application/json"],["GET","https://pubsub.googleapis.com/static/css/main.cc1ff1b3.css",200,"text/css"],["PUT","https://pubsub.googleapis.com/v1beta2/ggtdv?access_token=pisqitvbv&alt=json&callback=dosnmq&oauth_token=wdlnwuyz&upload_protocol=ibzb&uploadType=uapidqcxvh",200,"application/json"],["GET","https://pubsub.googleapis.com/__flags",200,"application/json"],["PUT","https://pubsub.googleapis.com/v1beta2/pgddzjn?%24.xgafv=1&access_token=agrgsvgst&alt=media&callback=npsy&oauth_token=rao&upload_protocol=gjjwhc",200,"application/json"],["PUT","https://pubsub.googleapis.com/v1beta2/xsy?fields=qspzblyu&key=qucwledst&oauth_token=pesvq&prettyPrint=false"aUser=jewttlgz",200,"application/json"],["GET","https://pubsub.googleapis.com/ping",200,"application/json"],["GET","https://pubsub.googleapis.com/ping",200,"application/json"],["GET","https://pubsub.googleapis.com/v1beta2/yohakjblc/subscriptions?%24.xgafv=1&alt=json&callback=chzphd&uploadType=yvouytwx&pageToken=gqap",200,"application/json"],["GET","https://pubsub.googleapis.com/static/media/logo.b00d81c2.svg",200,"image/svg+xml"],["GET","https://pubsub.googleapis.com/v1beta2/rbasbzfl/subscriptions?alt=media&callback=ukpz&key=uimxxxhzl&prettyPrint=false"aUser=tgnd&upload_protocol=doneges&pageSize=917&pageToken=vgzd",200,"application/json"],["GET","https://pubsub.googleapis.com/static/media/logo.65f6eb4e.svg",200,"image/svg+xml"],["POST","https://o849154222.ingest.sentry.io/api/849154222/envelope/?sentry_key=052e984b59e864801a025ce5",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://pubsub.googleapis.com/favicon.ico",200,"image/x-icon"],["POST","https://o314866180.ingest.sentry.io/api/314866180/envelope/?sentry_key=b44f93bb2cd9074d6cbdefd1",200,"application/json"],["GET","https://pubsub.googleapis.com/v1beta2/aenpqdxlwu/subscriptions?%24.xgafv=2&access_token=krapiyxc&fields=xiyzmlpi&oauth_token=hbergtaiqz&prettyPrint=true"aUser=wztvyyuioj&upload_protocol=uwircw&pageToken=dsbr",200,"application/json"],["GET","https://pubsub.googleapis.com/v1beta2/uextjk/topics?%24.xgafv=1&access_token=mdhtyiaojc&alt=media&callback=cefymzsoa&fields=mokflhel&key=zqqcgborag&oauth_token=svpn&prettyPrint=true"aUser=khvtgiwpf&upload_protocol=vhmibsa&uploadType=chxsphbko&pageSize=531&pageToken=mcyyqbvnym",200,"application/json"],["GET","https://pubsub.googleapis.com/static/js/main.bc3639eb.js",200,"application/javascript"],["DELETE","https://pubsub.googleapis.com/v1beta2/txbfbv?%24.xgafv=2&callback=sgq&fields=loc&key=kwfmwmppm"aUser=ddjlq&upload_protocol=ajzpxen",200,"application/json"],["GET","https://pubsub.googleapis.com/manifest.json",200,"application/json"],["POST","https://o345855211.ingest.sentry.io/api/345855211/envelope/?sentry_key=0a650fb34dd32f70b674c2f2",200,"application/json"],["GET","https://pubsub.googleapis.com/",200,"text/html"],["GET","https://pubsub.googleapis.com/robots.txt",200,"text/plain"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["DELETE","https://pubsub.googleapis.com/v1beta2/snjrj?access_token=hycub&fields=jbtt&key=flgpga&oauth_token=ibgblwal&prettyPrint=false"aUser=miscefnsr&uploadType=nyfnlbdvbk",200,"application/json"],["GET","https://pubsub.googleapis.com/__flags",200,"application/json"],["DELETE","https://pubsub.googleapis.com/v1beta2/qhuov?%24.xgafv=2&access_token=mbghmcoj&alt=proto&callback=ycvwjpti&key=chqeitqiyt&prettyPrint=true"aUser=esg&uploadType=wekvpuo",200,"application/json"],["POST","https://pubsub.googleapis.com/v1beta2/vbmsav:acknowledge?%24.xgafv=2&access_token=xcormfcdl&fields=eua&key=tgejmxtgm&prettyPrint=false&uploadType=cdkgw",200,"application/json"],["POST","https://pubsub.googleapis.com/v1beta2/clcyicw:acknowledge?access_token=flgltpq&key=zmas&upload_protocol=mpgaqkgju",200,"application/json"],["GET","https://pubsub.googleapis.com/__flags",200,"application/json"],["POST","https://pubsub.googleapis.com/v1beta2/gkisvlv:acknowledge?%24.xgafv=1&alt=media&callback=nwnqpor&key=dyfqzaz&oauth_token=cpmttir"aUser=ymnjoao&uploadType=vuzpgivwq",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://pubsub.googleapis.com/ping",200,"application/json"],["POST","https://o536070253.ingest.sentry.io/api/536070253/envelope/?sentry_key=cf9c751761d38eb62fe831a2",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-922160688&cid=922160688.922160688&en=page_view",204,"text/plain"],["GET","https://pubsub.googleapis.com/",200,"text/html"],["POST","https://pubsub.googleapis.com/v1beta2/lmk:modifyAckDeadline?%24.xgafv=1&alt=media&callback=udsgimgiz&fields=mnf&key=nekflbqk&oauth_token=mzupb"aUser=khxmyyo",200,"application/json"],["GET","https://pubsub.googleapis.com/manifest.json",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=432699031&fmt=gif",204,"image/gif"],["POST","https://pubsub.googleapis.com/v1beta2/tup:modifyAckDeadline?%24.xgafv=2&access_token=tugffcupth&alt=json&callback=atbaynimw&key=nfjtwnyr&oauth_token=igpbnpy&prettyPrint=true"aUser=zcq&upload_protocol=aeb&uploadType=drirx",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=451425469&fmt=gif",204,"image/gif"],["GET","https://pubsub.googleapis.com/manifest.json",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://pubsub.googleapis.com/v1beta2/oxsbsldhhd:modifyPushConfig?%24.xgafv=1&access_token=iswqzljjfg&alt=json&callback=megcow&fields=rrdtp&key=plydlc&oauth_token=faigum&prettyPrint=true"aUser=ncdzuuqjm&upload_protocol=vnueurabg&uploadType=zfiwfttd",200,"application/json"],["GET","https://pubsub.googleapis.com/",200,"text/html"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=721653802&fmt=gif",204,"image/gif"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=572796752&fmt=gif",204,"image/gif"],["GET","https://www.googletagmanager.com/gtag/js?id=G-706135465",200,"application/javascript"],["GET","https://pubsub.googleapis.com/manifest.json",200,"application/json"],["POST","https://pubsub.googleapis.com/v1beta2/ivqkbw:publish?access_token=nyg&fields=did&prettyPrint=false&upload_protocol=cgvch&uploadType=rha",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=80072039&fmt=gif",204,"image/gif"],["POST","https://pubsub.googleapis.com/v1beta2/jynejpx:publish?callback=ciigrpxe&fields=vsn&prettyPrint=true"aUser=vkmqvdsqnr&upload_protocol=mtx",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://pubsub.googleapis.com/static/js/main.549c29db.js",200,"application/javascript"],["GET","https://www.googletagmanager.com/gtag/js?id=G-732294859",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=736089040&fmt=gif",204,"image/gif"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://pubsub.googleapis.com/config.json\",\n \"headers\": {\n \"host\": \"pubsub.googleapis.com\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.googleapis.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.googleapis.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"80723966\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}"},{"id":"hubapi.com_crm","suite":"tier_a","tier":"A","title":"CRM cards","goal":"# CRM cards\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.hubapi.com`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `get_crm_v3_extensions_cards_sample_response_get_cards_sample_response(self) -> Any`: Get sample card detail response\n- `get_crm_v3_extensions_cards_app_id_get_all(self, app_id: int) -> Any`: Get all cards\n- `post_crm_v3_extensions_cards_app_id_create(self, app_id: int, body: dict) -> Any`: Create a new card\n- `get_crm_v3_extensions_cards_app_id_card_id_get_by_id(self, app_id: int, card_id: str) -> Any`: Get a card.\n- `patch_crm_v3_extensions_cards_app_id_card_id_update(self, app_id: int, card_id: str, body: dict) -> Any`: Update a card\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:apiKey","apikey_in:query","path_params","json_body","noise","partial_coverage"],"n_requests":40,"requests":[["GET","https://api.hubapi.com/sockjs-node/info",200,"application/json"],["GET","https://api.hubapi.com/sockjs-node/info",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.hubapi.com/robots.txt",200,"text/plain"],["GET","https://api.hubapi.com/crm/v3/extensions/cards/sample-response?hapikey=sk_ee45c5ce52c2fc3d69e79991",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=959556534&fmt=gif",204,"image/gif"],["GET","https://api.hubapi.com/static/js/main.fd0e689e.js",200,"application/javascript"],["POST","https://o18742894.ingest.sentry.io/api/18742894/envelope/?sentry_key=b6232f008c02c02c496caf27",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://fonts.gstatic.com/s/inter/v13/ef10105deac32455c7be0ee4.woff2",200,"font/woff2"],["GET","https://api.hubapi.com/crm/v3/extensions/cards/sample-response?hapikey=sk_ee45c5ce52c2fc3d69e79991",200,"application/json"],["POST","https://o388080881.ingest.sentry.io/api/388080881/envelope/?sentry_key=ef9afd00dcda0f1de3175f61",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/10752fddf91af40461ac5af7/analytics.min.js",200,"application/javascript"],["GET","https://api.hubapi.com/crm/v3/extensions/cards/sample-response?hapikey=sk_ee45c5ce52c2fc3d69e79991",200,"application/json"],["POST","https://o219398268.ingest.sentry.io/api/219398268/envelope/?sentry_key=c6633c90893b6fffafa22305",200,"application/json"],["GET","https://api.hubapi.com/crm/v3/extensions/cards/399?hapikey=sk_ee45c5ce52c2fc3d69e79991",200,"application/json"],["GET","https://api.hubapi.com/__flags",200,"application/json"],["GET","https://api.hubapi.com/crm/v3/extensions/cards/14?hapikey=sk_ee45c5ce52c2fc3d69e79991",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=819298391&fmt=gif",204,"image/gif"],["GET","https://api.hubapi.com/static/media/logo.734c2dfb.svg",200,"image/svg+xml"],["GET","https://api.hubapi.com/crm/v3/extensions/cards/588?hapikey=sk_ee45c5ce52c2fc3d69e79991",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-544078024&cid=544078024.544078024&en=page_view",204,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.hubapi.com/crm/v3/extensions/cards/31?hapikey=sk_ee45c5ce52c2fc3d69e79991",201,"application/json"],["GET","https://api.hubapi.com/crm/v3/extensions/cards/588/byxs?hapikey=sk_ee45c5ce52c2fc3d69e79991",200,"application/json"],["POST","https://o481007830.ingest.sentry.io/api/481007830/envelope/?sentry_key=a682d222df3e752342bcbf50",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.hubapi.com/crm/v3/extensions/cards/766/thgdtmlhum?hapikey=sk_ee45c5ce52c2fc3d69e79991",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.hubapi.com/",200,"text/html"],["PATCH","https://api.hubapi.com/crm/v3/extensions/cards/455/lcw?hapikey=sk_ee45c5ce52c2fc3d69e79991",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-482330555.js?sv=6",200,"application/javascript"],["GET","https://api.hubapi.com/__flags",200,"application/json"],["GET","https://api.hubapi.com/static/js/main.24f5e21d.js",200,"application/javascript"],["GET","https://api.hubapi.com/favicon.ico",200,"image/x-icon"],["PATCH","https://api.hubapi.com/crm/v3/extensions/cards/785/uvjqt?hapikey=sk_ee45c5ce52c2fc3d69e79991",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["PATCH","https://api.hubapi.com/crm/v3/extensions/cards/97/vbbkc?hapikey=sk_ee45c5ce52c2fc3d69e79991",200,"application/json"],["GET","https://api.hubapi.com/favicon.ico",200,"image/x-icon"],["POST","https://o607573532.ingest.sentry.io/api/607573532/envelope/?sentry_key=bcaf39810ff8e37b94719b5d",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.hubapi.com/sockjs-node/info\",\n \"headers\": {\n \"host\": \"api.hubapi.com\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.hubapi.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.hubapi.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"websocket\\\":true,\\\"origins\\\":[\\\"*:*\\\"],\\\"cookie_needed\\\":false,\\\"entropy\\\":259988056}\"\n }\n }\n}"},{"id":"impala.travel_hotels","suite":"tier_a","tier":"A","title":"Impala Hotel Booking API","goal":"# Impala Hotel Booking API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://sandbox.impala.travel/v1`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `create_booking(self, body: dict | None = None) -> Any`: Create a booking\n- `retrieve_booking(self, booking_id: str) -> Any`: Retrieve a booking\n- `update_booking(self, booking_id: str, body: dict | None = None) -> Any`: Change a booking\n- `cancel_booking(self, booking_id: str) -> Any`: Cancel a booking\n- `update_booking_contact(self, booking_id: str, body: dict | None = None) -> Any`: Change a booking contact\n- `retrieve_hotel(self, hotel_id: str, start: str | None = None, end: str | None = None) -> Any`: Retrieve a hotel\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:apiKey","apikey_in:header","base_path","path_params","query_params","json_body","noise"],"n_requests":47,"requests":[["GET","https://cdn.segment.com/analytics.js/v1/175c88fde58751ad7f8b6a41/analytics.min.js",200,"application/javascript"],["GET","https://sandbox.impala.travel/ping",200,"application/json"],["POST","https://sandbox.impala.travel/v1/bookings",202,"application/json"],["GET","https://sandbox.impala.travel/favicon.ico",200,"image/x-icon"],["GET","https://sandbox.impala.travel/static/css/main.20e82d14.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://sandbox.impala.travel/v1/bookings",202,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-184189070&cid=184189070.184189070&en=page_view",204,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=458147192&fmt=gif",204,"image/gif"],["POST","https://sandbox.impala.travel/v1/bookings",202,"application/json"],["GET","https://sandbox.impala.travel/sockjs-node/info",200,"application/json"],["GET","https://sandbox.impala.travel/v1/bookings/yhesxwrx",200,"application/json"],["GET","https://sandbox.impala.travel/ping",200,"application/json"],["GET","https://sandbox.impala.travel/static/js/main.f08c7d54.js",200,"application/javascript"],["GET","https://sandbox.impala.travel/static/css/main.898bb73c.css",200,"text/css"],["GET","https://sandbox.impala.travel/manifest.json",200,"application/json"],["PUT","https://sandbox.impala.travel/v1/bookings/sug",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=597433395&fmt=gif",204,"image/gif"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["DELETE","https://sandbox.impala.travel/v1/bookings/unbu",200,"application/json"],["GET","https://sandbox.impala.travel/static/js/main.2c634616.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-311376393&cid=311376393.311376393&en=page_view",204,"text/plain"],["GET","https://sandbox.impala.travel/ping",200,"application/json"],["GET","https://sandbox.impala.travel/__flags",200,"application/json"],["DELETE","https://sandbox.impala.travel/v1/bookings/mtvdxkk",200,"application/json"],["DELETE","https://sandbox.impala.travel/v1/bookings/mffikviqa",200,"application/json"],["PUT","https://sandbox.impala.travel/v1/bookings/otwwdmws/booking-contact",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/71ebe5c33cec34b3a840e70e.woff2",200,"font/woff2"],["GET","https://sandbox.impala.travel/static/js/main.28ee282a.js",200,"application/javascript"],["PUT","https://sandbox.impala.travel/v1/bookings/oei/booking-contact",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-118603115&cid=118603115.118603115&en=page_view",204,"text/plain"],["GET","https://cdn.segment.com/analytics.js/v1/149243b5d5e72ca9b945d96b/analytics.min.js",200,"application/javascript"],["PUT","https://sandbox.impala.travel/v1/bookings/rykenfanoc/booking-contact",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=71373915&fmt=gif",204,"image/gif"],["GET","https://sandbox.impala.travel/v1/hotels/a6873e9a-8c52-4f77-9212-cb0e9a70c0f9",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-408144365",200,"application/javascript"],["GET","https://sandbox.impala.travel/v1/hotels/a51d0ada-6b9b-4268-8265-7aeb57e20fdd?start=ykwhb&end=xclad",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=166714212&fmt=gif",204,"image/gif"],["GET","https://sandbox.impala.travel/v1/hotels/927fab9a-651c-4a66-a760-2b36249746d2?start=uiixerolmb&end=lqzmw",200,"application/json"],["GET","https://sandbox.impala.travel/manifest.json",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://sandbox.impala.travel/",200,"text/html"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://sandbox.impala.travel/ping\",\n \"headers\": {\n \"host\": \"sandbox.impala.travel\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.impala.travel\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.impala.travel/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"status\\\":\\\"ok\\\",\\\"t\\\":137713960}\"\n }\n }\n}"},{"id":"letmc.com_customer","suite":"tier_a","tier":"A","title":"agentOS Api V2, Customer Login Call Group","goal":"# agentOS Api V2, Customer Login Call Group\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://live-api.letmc.com`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `get_v2_customer_short_name_branch_branches_branch_id(self, short_name: str, branch_id: str) -> Any`: Get a specific branch given its unique Object ID (OID)\n- `landlord_controller_get_landlord_crm_entries(self, short_name: str, token: str) -> Any`: Retrieve landlord's CRM ID\n- `landlord_controller_get_settings(self, short_name: str, token: str) -> Any`: Get contact details of all linked landlords.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:none","path_params","query_params","noise","partial_coverage"],"n_requests":50,"requests":[["GET","https://live-api.letmc.com/favicon.ico",200,"image/x-icon"],["GET","https://live-api.letmc.com/sockjs-node/info",200,"application/json"],["GET","https://live-api.letmc.com/static/css/main.2aff500b.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://live-api.letmc.com/v2/customer/bcipdfvqmu/branch/branches/vabzrqd",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://live-api.letmc.com/manifest.json",200,"application/json"],["GET","https://live-api.letmc.com/manifest.json",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/086c7cb10ffe448c90ca8adc/analytics.min.js",200,"application/javascript"],["GET","https://live-api.letmc.com/v2/customer/rum/landlord/document?token=fgurpp&ID=lcingkexow",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/8668fdcb9168e34649c6168d/analytics.min.js",200,"application/javascript"],["GET","https://live-api.letmc.com/config.json",200,"application/json"],["GET","https://live-api.letmc.com/v2/customer/kxmuojpxra/landlord/document?token=irhcwchh&ID=wpdfb",200,"application/json"],["GET","https://live-api.letmc.com/v2/customer/ayhgcnmc/landlord/document?token=dyiehki&ID=wrl",200,"application/json"],["GET","https://live-api.letmc.com/ping",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://live-api.letmc.com/v2/customer/bbiplmbg/landlord/invoice?token=xmlfqo&invoiceID=wrgeiesdak",200,"application/json"],["GET","https://live-api.letmc.com/v2/customer/rvwu/landlord/invoice?token=oon&invoiceID=owkoseu",200,"application/json"],["GET","https://live-api.letmc.com/static/css/main.88cc8944.css",200,"text/css"],["GET","https://live-api.letmc.com/favicon.ico",200,"image/x-icon"],["GET","https://live-api.letmc.com/v2/customer/tyeo/landlord/invoice?token=powkvypa&invoiceID=iide",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=451198270&fmt=gif",204,"image/gif"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://live-api.letmc.com/config.json",200,"application/json"],["GET","https://live-api.letmc.com/v2/customer/hvbmxdz/landlord/landlordcrmentries?token=izyilk",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://live-api.letmc.com/config.json",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-805169991.js?sv=6",200,"application/javascript"],["GET","https://live-api.letmc.com/v2/customer/iegfwcrzc/landlord/sas?token=sinzccnw&yearEnd=184",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-256467558&cid=256467558.256467558&en=page_view",204,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=20107518&fmt=gif",204,"image/gif"],["GET","https://live-api.letmc.com/static/js/main.69e94aba.js",200,"application/javascript"],["GET","https://fonts.gstatic.com/s/inter/v13/74b5e120bbcf9342fe808d8e.woff2",200,"font/woff2"],["GET","https://live-api.letmc.com/v2/customer/kis/landlord/sas?token=trtl&yearEnd=435",200,"application/json"],["GET","https://live-api.letmc.com/manifest.json",200,"application/json"],["GET","https://live-api.letmc.com/static/js/main.b27be37c.js",200,"application/javascript"],["GET","https://live-api.letmc.com/v2/customer/zajir/landlord/settings?token=vdbbh",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-668489116&cid=668489116.668489116&en=page_view",204,"text/plain"],["GET","https://www.googletagmanager.com/gtag/js?id=G-865689117",200,"application/javascript"],["GET","https://live-api.letmc.com/v2/customer/rqytz/landlord/settings?token=rmtyqyk",200,"application/json"],["GET","https://live-api.letmc.com/v2/customer/dyichpf/landlord/tenancyagreement?token=vzazddsxsc&tenancyID=axhqaofy",200,"application/json"],["GET","https://live-api.letmc.com/",200,"text/html"],["POST","https://o111054833.ingest.sentry.io/api/111054833/envelope/?sentry_key=d6b9d1abcb92e8f351df8e02",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-793929500.js?sv=6",200,"application/javascript"],["GET","https://live-api.letmc.com/v2/customer/emhtyv/photo/download?token=poptallq&photoID=lnqnflms&width=854&height=10",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/b28bf33ec84e5ea67fc381f4.woff2",200,"font/woff2"],["GET","https://live-api.letmc.com/v2/customer/cfwkomy/photo/download?token=brkoq&photoID=tpotroikok&width=974",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-202304431",200,"application/javascript"],["POST","https://o276631120.ingest.sentry.io/api/276631120/envelope/?sentry_key=55b3e21205c93e289fb34f5f",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://live-api.letmc.com/sockjs-node/info\",\n \"headers\": {\n \"host\": \"live-api.letmc.com\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.letmc.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.letmc.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"websocket\\\":true,\\\"origins\\\":[\\\"*:*\\\"],\\\"cookie_needed\\\":false,\\\"entropy\\\":636805283}\"\n }\n }\n}"},{"id":"microsoft.com_cognitiveservices-ComputerVision","suite":"tier_a","tier":"A","title":"Computer Vision Client","goal":"# Computer Vision Client\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://westcentralus.api.cognitive.microsoft.com/vision/v2.1`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `get_area_of_interest(self, body: dict) -> Any`: This operation returns a bounding box around the most important area of the image.\n- `detect_objects(self, body: dict) -> Any`: Performs object detection on the specified image.\n- `list_models(self) -> Any`: This operation returns the list of domain-specific models that are supported by the Computer Vision API. Currently, the \n- `analyze_image_by_domain(self, model: str, body: dict, language: str | None = None) -> Any`: This operation recognizes content within an image by applying a domain-specific model. The list of domain-specific model\n- `recognize_printed_text(self, detect_orientation: bool, body: dict, language: str | None = None) -> Any`: Optical Character Recognition (OCR) detects text in an image and extracts the recognized characters into a machine-usabl\n- `tag_image(self, body: dict, language: str | None = None) -> Any`: This operation generates a list of words, or tags, that are relevant to the content of the supplied image. The Computer \n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:apiKey","apikey_in:header","base_path","path_params","query_params","json_body","noise","partial_coverage"],"n_requests":50,"requests":[["GET","https://westcentralus.api.cognitive.microsoft.com/manifest.json",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-452083463&cid=452083463.452083463&en=page_view",204,"text/plain"],["GET","https://westcentralus.api.cognitive.microsoft.com/static/media/logo.f6340f3c.svg",200,"image/svg+xml"],["POST","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/areaOfInterest",200,"x-unknown"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-625208230&cid=625208230.625208230&en=page_view",204,"text/plain"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/areaOfInterest",200,"x-unknown"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://westcentralus.api.cognitive.microsoft.com/favicon.ico",200,"image/x-icon"],["POST","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/detect",200,"application/json"],["GET","https://westcentralus.api.cognitive.microsoft.com/__flags",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/detect",200,"application/json"],["GET","https://westcentralus.api.cognitive.microsoft.com/static/css/main.747e9a15.css",200,"text/css"],["POST","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/detect",200,"application/json"],["GET","https://westcentralus.api.cognitive.microsoft.com/",200,"text/html"],["GET","https://westcentralus.api.cognitive.microsoft.com/manifest.json",200,"application/json"],["GET","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/models",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/models",200,"application/json"],["POST","https://o762807961.ingest.sentry.io/api/762807961/envelope/?sentry_key=18cf1e031a75258b68349311",200,"application/json"],["GET","https://westcentralus.api.cognitive.microsoft.com/static/css/main.425d7fb2.css",200,"text/css"],["POST","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/models/iorcohsk/analyze?language=zh",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://westcentralus.api.cognitive.microsoft.com/__flags",200,"application/json"],["GET","https://westcentralus.api.cognitive.microsoft.com/config.json",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://westcentralus.api.cognitive.microsoft.com/favicon.ico",200,"image/x-icon"],["GET","https://westcentralus.api.cognitive.microsoft.com/manifest.json",200,"application/json"],["POST","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/models/ghua/analyze?language=pt",200,"application/json"],["GET","https://westcentralus.api.cognitive.microsoft.com/robots.txt",200,"text/plain"],["GET","https://westcentralus.api.cognitive.microsoft.com/favicon.ico",200,"image/x-icon"],["POST","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/models/bdudn/analyze",200,"application/json"],["POST","https://o956335197.ingest.sentry.io/api/956335197/envelope/?sentry_key=dbbf907855156de6cc85314a",200,"application/json"],["POST","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/ocr?detectOrientation=true&language=fr",200,"x-unknown"],["POST","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/ocr?detectOrientation=true",200,"application/json"],["GET","https://westcentralus.api.cognitive.microsoft.com/__flags",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/ocr?detectOrientation=false&language=sv",200,"application/json"],["GET","https://westcentralus.api.cognitive.microsoft.com/static/js/main.2ec13166.js",200,"application/javascript"],["POST","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/tag",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://westcentralus.api.cognitive.microsoft.com/ping",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://fonts.gstatic.com/s/inter/v13/5979a2c87ba134333640746b.woff2",200,"font/woff2"],["GET","https://px.ads.linkedin.com/collect?pid=495261048&fmt=gif",204,"image/gif"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://westcentralus.api.cognitive.microsoft.com/vision/v2.1/tag?language=zh",200,"x-unknown"],["POST","https://api.segment.io/v1/t",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://westcentralus.api.cognitive.microsoft.com/manifest.json\",\n \"headers\": {\n \"host\": \"westcentralus.api.cognitive.microsoft.com\",\n \"connection\": \"keep-alive\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"manifest\",\n \"referer\": \"https://app.microsoft.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"short_name\\\":\\\"App\\\",\\\"start_url\\\":\\\".\\\",\\\"display\\\":\\\"standalone\\\",\\\"icons\\\":[]}\"\n }\n }\n}"},{"id":"netlicensing.io","suite":"tier_a","tier":"A","title":"Labs64 NetLicensing RESTful API Test Center","goal":"# Labs64 NetLicensing RESTful API Test Center\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://go.netlicensing.io/core/v2/rest`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `list_product_modules(self) -> Any`: List Product Modules\n- `list_tokens(self) -> Any`: List Tokens\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:basic","base_path","noise","partial_coverage"],"n_requests":47,"requests":[["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://go.netlicensing.io/core/v2/rest/license",200,"application/json"],["GET","https://go.netlicensing.io/static/media/logo.4dadaa20.svg",200,"image/svg+xml"],["GET","https://go.netlicensing.io/favicon.ico",200,"image/x-icon"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-802212061&cid=802212061.802212061&en=page_view",204,"text/plain"],["GET","https://go.netlicensing.io/core/v2/rest/license/rjobbdh",200,"application/json"],["GET","https://go.netlicensing.io/favicon.ico",200,"image/x-icon"],["GET","https://cdn.segment.com/analytics.js/v1/3157c7ba21dc2d8eed2dd5d2/analytics.min.js",200,"application/javascript"],["POST","https://o724912530.ingest.sentry.io/api/724912530/envelope/?sentry_key=cb7052a883bad496135f4e68",200,"application/json"],["GET","https://go.netlicensing.io/core/v2/rest/license/ltzmdnry",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-347480913&cid=347480913.347480913&en=page_view",204,"text/plain"],["GET","https://go.netlicensing.io/static/js/main.5e730592.js",200,"application/javascript"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://go.netlicensing.io/core/v2/rest/license/uriugvv",200,"application/json"],["GET","https://go.netlicensing.io/",200,"text/html"],["DELETE","https://go.netlicensing.io/core/v2/rest/license/hfmazxb",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-870329657&cid=870329657.870329657&en=page_view",204,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-561073829&cid=561073829.561073829&en=page_view",204,"text/plain"],["DELETE","https://go.netlicensing.io/core/v2/rest/license/dtybontq",200,"application/json"],["GET","https://go.netlicensing.io/core/v2/rest/licensee/zosnicdxz",200,"application/json"],["GET","https://go.netlicensing.io/core/v2/rest/licensee/kdfqfi",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["DELETE","https://go.netlicensing.io/core/v2/rest/licensetemplate/dvq?forceCascade=true",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/e2e30c7ae461a0eddd55c269.woff2",200,"font/woff2"],["GET","https://static.hotjar.com/c/hotjar-133038800.js?sv=6",200,"application/javascript"],["POST","https://o981874507.ingest.sentry.io/api/981874507/envelope/?sentry_key=f56d455457c85abcf9773377",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["DELETE","https://go.netlicensing.io/core/v2/rest/licensetemplate/ulec?forceCascade=true",200,"application/json"],["GET","https://go.netlicensing.io/static/media/logo.0d9287c9.svg",200,"image/svg+xml"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://go.netlicensing.io/core/v2/rest/paymentmethod/nbydel",200,"application/json"],["POST","https://o622756208.ingest.sentry.io/api/622756208/envelope/?sentry_key=bb02d12ecf952f10d163e24e",200,"application/json"],["POST","https://o776486416.ingest.sentry.io/api/776486416/envelope/?sentry_key=4d4a69838167bc5ded4a95ff",200,"application/json"],["GET","https://go.netlicensing.io/core/v2/rest/paymentmethod/grsurx",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=128182120&fmt=gif",204,"image/gif"],["GET","https://go.netlicensing.io/ping",200,"application/json"],["GET","https://go.netlicensing.io/core/v2/rest/productmodule",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://fonts.gstatic.com/s/inter/v13/e842df528128b0c8ac1fb747.woff2",200,"font/woff2"],["GET","https://go.netlicensing.io/config.json",200,"application/json"],["GET","https://go.netlicensing.io/core/v2/rest/token",200,"application/json"],["GET","https://go.netlicensing.io/__flags",200,"application/json"],["GET","https://go.netlicensing.io/favicon.ico",200,"image/x-icon"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://go.netlicensing.io/ping",200,"application/json"],["GET","https://go.netlicensing.io/config.json",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.netlicensing.io\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.netlicensing.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}"},{"id":"nexmo.com_application.v2","suite":"tier_a","tier":"A","title":"Application API","goal":"# Application API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.nexmo.com/v2/applications`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `list_application(self, page_size: int | None = None, page: int | None = None) -> Any`: List available applications\n- `create_application(self, body: dict) -> Any`: Create an application\n- `get_application(self, id: str) -> Any`: Get an application\n- `update_application(self, id: str, body: dict) -> Any`: Update an application\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:basic","base_path","path_params","query_params","json_body","noise","partial_coverage"],"n_requests":27,"requests":[["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.nexmo.com/manifest.json",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-720541765&cid=720541765.720541765&en=page_view",204,"text/plain"],["GET","https://www.googletagmanager.com/gtag/js?id=G-633500746",200,"application/javascript"],["GET","https://api.nexmo.com/v2/applications/?page_size=141&page=294",200,"application/json"],["GET","https://api.nexmo.com/config.json",200,"application/json"],["POST","https://o81371528.ingest.sentry.io/api/81371528/envelope/?sentry_key=8509a3df049b02b480f18669",200,"application/json"],["POST","https://api.nexmo.com/v2/applications/",201,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.nexmo.com/static/css/main.c79f3e6a.css",200,"text/css"],["POST","https://api.nexmo.com/v2/applications/",201,"application/json"],["GET","https://api.nexmo.com/v2/applications/ieerkumx",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.nexmo.com/v2/applications/oilg",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.nexmo.com/config.json",200,"application/json"],["GET","https://api.nexmo.com/v2/applications/etl",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["PUT","https://api.nexmo.com/v2/applications/mzech",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://o789329486.ingest.sentry.io/api/789329486/envelope/?sentry_key=7cec9416135ec8f4aeb08358",200,"application/json"],["PUT","https://api.nexmo.com/v2/applications/aanu",200,"application/json"],["GET","https://api.nexmo.com/__flags",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-419778282&cid=419778282.419778282&en=page_view",204,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.nexmo.com\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.nexmo.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}"},{"id":"openstates.org","suite":"tier_a","tier":"A","title":"Open States API v3","goal":"# Open States API v3\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://openstates.org`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `bills_search_bills_get(self, jurisdiction: str | None = None, session: str | None = None, chamber: str | None = None, identifier: list | None = None, classification: str | None = None, subject: list | None = None, updated_since: str | None = None, created_since: str | None = None, action_since: str | None = None, sort: str | None = None, sponsor: str | None = None, sponsor_classification: str | None = None, q: str | None = None, include: list | None = None, page: int | None = None, per_page: int | None = None, apikey: str | None = None) -> Any`: Bills Search\n- `bill_detail_by_id_bills_ocd_bill_openstates_bill_id_get(self, openstates_bill_id: str, include: list | None = None, apikey: str | None = None) -> Any`: Bill Detail By Id\n- `bill_detail_bills_jurisdiction_session_bill_id_get(self, jurisdiction: str, session: str, bill_id: str, include: list | None = None, apikey: str | None = None) -> Any`: Bill Detail\n- `committee_detail_committees_committee_id_get(self, committee_id: str, include: list | None = None, apikey: str | None = None) -> Any`: Committee Detail\n- `event_detail_events_event_id_get(self, event_id: str, include: list | None = None, apikey: str | None = None) -> Any`: Event Detail\n- `jurisdiction_detail_jurisdictions_jurisdiction_id_get(self, jurisdiction_id: str, include: list | None = None, apikey: str | None = None) -> Any`: Jurisdiction Detail\n- `metrics_metrics_get(self) -> Any`: Metrics\n- `people_search_people_get(self, jurisdiction: str | None = None, name: str | None = None, id: list | None = None, org_classification: str | None = None, district: str | None = None, include: list | None = None, page: int | None = None, per_page: int | None = None, apikey: str | None = None) -> Any`: People Search\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:none","path_params","query_params","noise","partial_coverage"],"n_requests":63,"requests":[["GET","https://cdn.segment.com/analytics.js/v1/8194d26903e37da61c68bfcf/analytics.min.js",200,"application/javascript"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-84898353&cid=84898353.84898353&en=page_view",204,"text/plain"],["GET","https://openstates.org/static/media/logo.20094ad4.svg",200,"image/svg+xml"],["GET","https://openstates.org/bills?session=tqff&chamber=ieykdstaiu&classification=ttmvrbvixs&subject=socyxyudl&updated_since=jjmpd&sort=latest_action_asc&sponsor=peeobpaxwc&sponsor_classification=simymcr&q=dhsqih&per_page=50&apikey=jrnby",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://openstates.org/bills?jurisdiction=imry&session=mcenacp&chamber=fmkfhes&subject=gdnhshwo&updated_since=ertlkgm&action_since=tmqlatoz&sponsor=dzdgmb",200,"application/json"],["GET","https://openstates.org/bills?jurisdiction=onnuw&session=rsncrb&identifier=tkhurj&identifier=bgolqzpaz&identifier=mwejmp&subject=lvzbbr&subject=sgsetikc&updated_since=adrwuaw&created_since=ekvpjamwm&action_since=iletz&sponsor=tplgxxylbn&sponsor_classification=vzcjtkwv&include=related_bills&page=621&per_page=723&apikey=ttya",200,"application/json"],["GET","https://openstates.org/sockjs-node/info",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://openstates.org/favicon.ico",200,"image/x-icon"],["GET","https://openstates.org/bills/ocd-bill/qxggl",200,"application/json"],["GET","https://openstates.org/bills/ocd-bill/hocj?include=documents&include=votes&include=sponsorships",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-234361752",200,"application/javascript"],["GET","https://openstates.org/bills/ocd-bill/wgr?apikey=beqzdakkwm",200,"application/json"],["GET","https://openstates.org/favicon.ico",200,"image/x-icon"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/0360f8d068ccfdcc0c35c05d/analytics.min.js",200,"application/javascript"],["GET","https://openstates.org/bills/bjomz/czwmwcu/odlu?apikey=gxf",200,"application/json"],["GET","https://openstates.org/static/media/logo.62cec3de.svg",200,"image/svg+xml"],["GET","https://openstates.org/bills/poreojd/ekqghz/vkcgnxfgg?include=sources&include=sources&apikey=tykb",200,"application/json"],["GET","https://openstates.org/static/js/main.e5e2d30f.js",200,"application/javascript"],["GET","https://openstates.org/bills/shbqi/dmbmziv/kijh?apikey=phfb",200,"application/json"],["GET","https://openstates.org/",200,"text/html"],["GET","https://px.ads.linkedin.com/collect?pid=707324476&fmt=gif",204,"image/gif"],["POST","https://o936759027.ingest.sentry.io/api/936759027/envelope/?sentry_key=03d73e4d529733b06431c14e",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://openstates.org/favicon.ico",200,"image/x-icon"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://openstates.org/robots.txt",200,"text/plain"],["GET","https://openstates.org/committees/ojklrsrq?include=sources&apikey=otbakcoszi",200,"application/json"],["GET","https://openstates.org/committees/bly",200,"application/json"],["GET","https://openstates.org/__flags",200,"application/json"],["GET","https://openstates.org/committees/vzug",200,"application/json"],["GET","https://openstates.org/events/plfazt?include=agenda&include=links&apikey=dwlhbre",200,"application/json"],["GET","https://openstates.org/__flags",200,"application/json"],["GET","https://openstates.org/",200,"text/html"],["GET","https://openstates.org/config.json",200,"application/json"],["GET","https://openstates.org/events/fogwuocris",200,"application/json"],["GET","https://openstates.org/favicon.ico",200,"image/x-icon"],["GET","https://openstates.org/events/fzqjyitecz?apikey=jdsyto",200,"application/json"],["GET","https://openstates.org/manifest.json",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://static.hotjar.com/c/hotjar-568118392.js?sv=6",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/7017bff9aad0e6ad38f991ed/analytics.min.js",200,"application/javascript"],["GET","https://openstates.org/jurisdictions/gwxe?include=latest_runs&apikey=jllyfvkdq",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-206559126.js?sv=6",200,"application/javascript"],["GET","https://openstates.org/metrics",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://openstates.org/metrics",200,"application/json"],["GET","https://openstates.org/config.json",200,"application/json"],["GET","https://openstates.org/ping",200,"application/json"],["GET","https://openstates.org/people?jurisdiction=kcyp&name=rbimbup&id=dngzxibbc&id=turrzdvl&id=illihd&org_classification=government&district=mfbpazyewy&include=offices&include=other_names&page=745&per_page=841&apikey=zfcnwahbs",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=274384845&fmt=gif",204,"image/gif"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://openstates.org/bills?session=tqff&chamber=ieykdstaiu&classification=ttmvrbvixs&subject=socyxyudl&updated_since=jjmpd&sort=latest_action_asc&sponsor=peeobpaxwc&sponsor_classification=simymcr&q=dhsqih&per_page=50&apikey=jrnby\",\n \"headers\": {\n \"host\": \"openstates.org\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.openstates.org\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.openstates.org/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"pagination\\\":{\\\"max_page\\\":798,\\\"page\\\":877,\\\"per_page\\\":862,\\\"total_items\\\":187},\\\"results\\\":[{\\\"actions\\\":[{},{},{}],\\\"classification\\\":[\\\"xcz\\\",\\\"sdotdlbjg\\\",\\\"mkx\\\"],\\\"created_at\\\":\\\"2021-01-24T05:07:29Z\\\",\\\"documents\\\":[{},{}],\\\"extras\\\":{},\\\"first_action_date\\\":\\\"uvhymmnyhk\\\",\\\"from_organization\\\":{\\\"classification\\\":\\\"ygux\\\",\\\"id\\\":\\\"pwrfv\\\",\\\"name\\\":\\\"kadjtcts\\\"},\\\"id\\\":\\\"fjwl\\\",\\\"identifier\\\":\\\"tgfgo\\\",\\\"jurisdiction\\\":{\\\"classification\\\":\\\"state\\\",\\\"id\\\":\\\"pfhc\\\",\\\"name\\\":\\\"wqlz\\\"},\\\"latest_action_description\\\":\\\"ikghmp\\\",\\\"openstates_url\\\":\\\"ygk\\\",\\\"other_titles\\\":[{},{}],\\\"session\\\":\\\"unut\\\",\\\"sources\\\":[{},{}],\\\"title\\\":\\\"ycub"},{"id":"ote-godaddy.com_certificates","suite":"tier_a","tier":"A","title":"ote-godaddy.com:certificates","goal":"# ote-godaddy.com:certificates\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.ote-godaddy.com`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `certificate_get(self, certificate_id: str) -> Any`: Retrieve certificate details\n- `certificate_action_retrieve(self, certificate_id: str) -> Any`: Retrieve all certificate actions\n- `certificate_callback_get(self, certificate_id: str) -> Any`: Retrieve system stateful action callback url\n- `certificate_alternate_email_address(self, certificate_id: str, email_address: str) -> Any`: Add alternate email address\n- `certificate_siteseal_get(self, certificate_id: str, theme: str | None = None, locale: str | None = None) -> Any`: Get Site seal\n- `get_customer_certificates_by_customer_id(self, customer_id: str, offset: int | None = None, limit: int | None = None) -> Any`: Retrieve customer's certificates\n- `get_acme_external_account_binding(self, customer_id: str) -> Any`: Retrieves the external account binding for the specified customer\n- `get_domain_details_by_domain(self, customer_id: str, certificate_id: str, domain: str) -> Any`: Retrieve detailed information for supplied domain\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:none","path_params","query_params","noise","partial_coverage"],"n_requests":50,"requests":[["GET","https://api.ote-godaddy.com/static/js/main.d6f71590.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=704480969&fmt=gif",204,"image/gif"],["GET","https://api.ote-godaddy.com/v1/certificates/oycjyx",200,"application/json"],["POST","https://o954387448.ingest.sentry.io/api/954387448/envelope/?sentry_key=cc669a6aca36ef38ef46e0ee",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/bc67f9105bee5cae63b5d7e8.woff2",200,"font/woff2"],["GET","https://api.ote-godaddy.com/v1/certificates/erzk",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.ote-godaddy.com/v1/certificates/hdj",200,"application/json"],["GET","https://api.ote-godaddy.com/static/js/main.9f76d56b.js",200,"application/javascript"],["GET","https://api.ote-godaddy.com/v1/certificates/irrgvwivfy/actions",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.ote-godaddy.com/v1/certificates/vtqdvw/actions",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=189076880&fmt=gif",204,"image/gif"],["GET","https://api.ote-godaddy.com/v1/certificates/tgcafvy/callback",200,"application/json"],["POST","https://o571935228.ingest.sentry.io/api/571935228/envelope/?sentry_key=39fa169d12ef56d22f80a853",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.ote-godaddy.com/v1/certificates/owfnzbwo/email/resend/ddtmla",200,"application/json"],["GET","https://api.ote-godaddy.com/robots.txt",200,"text/plain"],["GET","https://api.ote-godaddy.com/favicon.ico",200,"image/x-icon"],["GET","https://api.ote-godaddy.com/v1/certificates/kgialc/siteSeal?theme=LIGHT",200,"application/json"],["GET","https://api.ote-godaddy.com/static/media/logo.0fb65914.svg",200,"image/svg+xml"],["GET","https://static.hotjar.com/c/hotjar-617002758.js?sv=6",200,"application/javascript"],["GET","https://api.ote-godaddy.com/v1/certificates/lbya/siteSeal?locale=xbf",200,"application/json"],["GET","https://api.ote-godaddy.com/sockjs-node/info",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/5c04faf061791fd9eadfd7d2/analytics.min.js",200,"application/javascript"],["GET","https://static.hotjar.com/c/hotjar-955984644.js?sv=6",200,"application/javascript"],["GET","https://api.ote-godaddy.com/v1/certificates/scwyjwmop/siteSeal?theme=LIGHT",200,"application/json"],["POST","https://o264683933.ingest.sentry.io/api/264683933/envelope/?sentry_key=b61d40e3a07e5d1091489732",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://cdn.segment.com/analytics.js/v1/b1e4ac86f61dfeda080522bd/analytics.min.js",200,"application/javascript"],["GET","https://api.ote-godaddy.com/v2/customers/nvqztf/certificates?offset=419",200,"application/json"],["GET","https://api.ote-godaddy.com/sockjs-node/info",200,"application/json"],["GET","https://api.ote-godaddy.com/sockjs-node/info",200,"application/json"],["POST","https://o888507853.ingest.sentry.io/api/888507853/envelope/?sentry_key=a9d12ade3aa9aa367509bf09",200,"application/json"],["GET","https://api.ote-godaddy.com/config.json",200,"application/json"],["GET","https://api.ote-godaddy.com/v2/customers/kscncsord/certificates",200,"application/json"],["GET","https://api.ote-godaddy.com/v2/customers/gezt/certificates?limit=653",200,"application/json"],["GET","https://api.ote-godaddy.com/static/media/logo.996bc786.svg",200,"image/svg+xml"],["GET","https://www.googletagmanager.com/gtag/js?id=G-438316152",200,"application/javascript"],["GET","https://static.hotjar.com/c/hotjar-692464906.js?sv=6",200,"application/javascript"],["GET","https://api.ote-godaddy.com/v2/customers/idjynzp/certificates/acme/externalAccountBinding",200,"application/json"],["GET","https://api.ote-godaddy.com/manifest.json",200,"application/json"],["GET","https://api.ote-godaddy.com/favicon.ico",200,"image/x-icon"],["GET","https://api.ote-godaddy.com/v2/customers/rges/certificates/ibwtt/domainVerifications/etxyx",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.ote-godaddy.com/config.json",200,"application/json"],["GET","https://api.ote-godaddy.com/static/js/main.42f90626.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.ote-godaddy.com/v1/certificates/oycjyx\",\n \"headers\": {\n \"host\": \"api.ote-godaddy.com\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.ote-godaddy.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.ote-godaddy.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"certificateId\\\":\\\"btjvg\\\",\\\"commonName\\\":\\\"rtpoipz\\\",\\\"contact\\\":{\\\"email\\\":\\\"lydv\\\",\\\"jobTitle\\\":\\\"tvvzjry\\\",\\\"nameFirst\\\":\\\"wgw\\\",\\\"nameLast\\\":\\\"jrpzgsdml\\\",\\\"phone\\\":\\\"ret\\\",\\\"suffix\\\":\\\"gal\\\"},\\\"createdAt\\\":\\\"ujguxw\\\",\\\"organization\\\":{\\\"address\\\":{\\\"address1\\\":\\\"ydlcnsh\\\",\\\"country\\\":\\\"IN\\\",\\\"postalCode\\\":\\\"buhonaq\\\"},\\\"assumedName\\\":\\\"ooqvlmqfnv\\\",\\\"name\\\":\\\"hxjbxsjqz\\\",\\\"phone\\\":\\\"dhtw\\\"},\\\"period\\\":881,\\\"productType\\\":\\\"UCC_EV_SSL\\\",\\\"progress\\\":180,\\\"revokedAt\\\":\\\"tuzimbspoc\\\",\\\"rootType\\\":\\\"GODADDY_SHA_1\\\",\\\"serialNumber\\\":\\\"spwiwxrz\\\",\\\"serialNumberHex\\\":\\\"gamktrenx\\\",\\\"status\\\":\\\"PENDING_REKEY\\\",\\\"validStart\\\":\\\"rafersjz\\\"}\"\n }\n }\n}"},{"id":"pdfbroker.io","suite":"tier_a","tier":"A","title":"PdfBroker.io API","goal":"# PdfBroker.io API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://pdfbroker.io`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `post_api_pdf_pdfconcat(self, body: dict | None = None) -> Any`: Concatenate multiple pdf files into single pdf file..\n- `post_api_pdf_pdftoimage(self, body: dict | None = None) -> Any`: Generate an image of to provided pdf file\n- `post_api_pdf_pdfwritestring(self, body: dict | None = None) -> Any`: Write text on a page in a pdf document.\n- `post_api_pdf_wkhtmltopdf(self, body: dict | None = None) -> Any`: Generate pdf file from url using the excellent tool wkhtmltopdf.\n- `create_pdf_file_from_complete_xsl_fo_document(self, body: dict | None = None) -> Any`: Create pdf-file from complete XSL-FO document.\n- `post_api_pdf_xslfowithtransform(self, body: dict | None = None) -> Any`: Create pdf-file from transforming xml document with Xsl-Fo transform document.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:bearer","json_body","noise"],"n_requests":27,"requests":[["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://pdfbroker.io/manifest.json",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://pdfbroker.io/",200,"text/html"],["POST","https://pdfbroker.io/api/pdf/pdfconcat",200,"application/json"],["GET","https://pdfbroker.io/favicon.ico",200,"image/x-icon"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-647834968&cid=647834968.647834968&en=page_view",204,"text/plain"],["POST","https://pdfbroker.io/api/pdf/pdfconcat",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=900710766&fmt=gif",204,"image/gif"],["POST","https://pdfbroker.io/api/pdf/pdftoimage",200,"application/json"],["POST","https://pdfbroker.io/api/pdf/pdfwritestring",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://pdfbroker.io/",200,"text/html"],["POST","https://pdfbroker.io/api/pdf/wkhtmltopdf",200,"application/json"],["GET","https://pdfbroker.io/ping",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=836840661&fmt=gif",204,"image/gif"],["POST","https://pdfbroker.io/api/pdf/xslfo",200,"application/json"],["POST","https://pdfbroker.io/api/pdf/xslfowithtransform",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://pdfbroker.io/api/pdf/xslfowithtransform",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://pdfbroker.io/__flags",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=678641288&fmt=gif",204,"image/gif"],["GET","https://pdfbroker.io/",200,"text/html"],["GET","https://pdfbroker.io/__flags",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://pdfbroker.io/manifest.json\",\n \"headers\": {\n \"host\": \"pdfbroker.io\",\n \"connection\": \"keep-alive\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"manifest\",\n \"referer\": \"https://app.pdfbroker.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"short_name\\\":\\\"App\\\",\\\"start_url\\\":\\\".\\\",\\\"display\\\":\\\"standalone\\\",\\\"icons\\\":[]}\"\n }\n }\n}"},{"id":"pinecone.io","suite":"tier_a","tier":"A","title":"Pinecone API","goal":"# Pinecone API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://controller.us-east1-gcp.pinecone.io`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `list_collections(self) -> Any`: List collections\n- `describe_collection(self, collection_name: str) -> Any`: Describe collection\n- `describe_index_stats(self, body: dict) -> Any`: Describe Index Stats\n- `list_indexes(self) -> Any`: List indexes\n- `query(self, body: dict) -> Any`: Query\n- `fetch(self, body: dict) -> Any`: Fetch\n- `upsert(self, body: dict) -> Any`: Upsert\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:apiKey","apikey_in:header","path_params","json_body","noise","partial_coverage"],"n_requests":57,"requests":[["GET","https://controller.us-east1-gcp.pinecone.io/static/css/main.b92372b5.css",200,"text/css"],["GET","https://controller.us-east1-gcp.pinecone.io/sockjs-node/info",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=699995042&fmt=gif",204,"image/gif"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://controller.us-east1-gcp.pinecone.io/collections",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://controller.us-east1-gcp.pinecone.io/config.json",200,"application/json"],["POST","https://o466204306.ingest.sentry.io/api/466204306/envelope/?sentry_key=2baefc53348192ff1b94b2b2",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/collections",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/collections",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/",200,"text/html"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/static/css/main.2fd58dd9.css",200,"text/css"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/collections/bqwkh",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/favicon.ico",200,"image/x-icon"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-729642641&cid=729642641.729642641&en=page_view",204,"text/plain"],["GET","https://controller.us-east1-gcp.pinecone.io/collections/hupuvlu",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/robots.txt",200,"text/plain"],["GET","https://controller.us-east1-gcp.pinecone.io/collections/ajb",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/config.json",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/sockjs-node/info",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/favicon.ico",200,"image/x-icon"],["POST","https://controller.us-east1-gcp.pinecone.io/describe_index_stats",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-789131513&cid=789131513.789131513&en=page_view",204,"text/plain"],["GET","https://controller.us-east1-gcp.pinecone.io/",200,"text/html"],["GET","https://controller.us-east1-gcp.pinecone.io/static/css/main.bb5ce862.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://controller.us-east1-gcp.pinecone.io/describe_index_stats",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/",200,"text/html"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=926246863&fmt=gif",204,"image/gif"],["GET","https://controller.us-east1-gcp.pinecone.io/indexes",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/indexes",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-755584532.js?sv=6",200,"application/javascript"],["POST","https://controller.us-east1-gcp.pinecone.io/query",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/robots.txt",200,"text/plain"],["POST","https://controller.us-east1-gcp.pinecone.io/query",200,"application/json"],["POST","https://controller.us-east1-gcp.pinecone.io/vectors/fetch",200,"application/json"],["POST","https://controller.us-east1-gcp.pinecone.io/vectors/fetch",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/config.json",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-668298477.js?sv=6",200,"application/javascript"],["GET","https://controller.us-east1-gcp.pinecone.io/",200,"text/html"],["GET","https://controller.us-east1-gcp.pinecone.io/ping",200,"application/json"],["POST","https://controller.us-east1-gcp.pinecone.io/vectors/update",200,"application/json"],["GET","https://controller.us-east1-gcp.pinecone.io/static/css/main.a830356b.css",200,"text/css"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-252436706&cid=252436706.252436706&en=page_view",204,"text/plain"],["POST","https://o781004520.ingest.sentry.io/api/781004520/envelope/?sentry_key=1fb89f40eaf1fd9c735dc315",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/088b04d3f843b2e8def4223e.woff2",200,"font/woff2"],["POST","https://controller.us-east1-gcp.pinecone.io/vectors/upsert",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-590715473&cid=590715473.590715473&en=page_view",204,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-428211246&cid=428211246.428211246&en=page_view",204,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://controller.us-east1-gcp.pinecone.io/vectors/upsert",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://www.googletagmanager.com/gtag/js?id=G-60263074",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://controller.us-east1-gcp.pinecone.io/sockjs-node/info\",\n \"headers\": {\n \"host\": \"controller.us-east1-gcp.pinecone.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.pinecone.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pinecone.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"websocket\\\":true,\\\"origins\\\":[\\\"*:*\\\"],\\\"cookie_needed\\\":false,\\\"entropy\\\":301855991}\"\n }\n }\n}"},{"id":"redhat.com_catalog_inventory","suite":"tier_a","tier":"A","title":"Catalog Inventory","goal":"# Catalog Inventory\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://cloud.redhat.com//api/catalog-inventory/v1.0`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `show_service_credential_type(self, id: str) -> Any`: Show an existing ServiceCredentialType\n- `show_service_instance(self, id: str) -> Any`: Show an existing ServiceInstance\n- `show_service_offering(self, id: str) -> Any`: Show an existing ServiceOffering\n- `applied_inventories_tags_for_service_offering(self, id: str, body: dict) -> Any`: Invokes computing of ServiceInventories tags for given ServiceOffering\n- `order_service_offering(self, id: str, body: dict) -> Any`: Order an existing ServiceOffering\n- `show_service_plan(self, id: str) -> Any`: Show an existing ServicePlan\n- `show_source(self, id: str) -> Any`: Show an existing Source\n- `show_task(self, id: str) -> Any`: Show an existing Task\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:basic","base_path","path_params","json_body","noise","partial_coverage"],"n_requests":57,"requests":[["GET","https://cloud.redhat.com//api/catalog-inventory/v1.0/service_credential_types/yjahxsiecn",200,"application/json"],["GET","https://cloud.redhat.com/static/media/logo.93f4a103.svg",200,"image/svg+xml"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://cloud.redhat.com//api/catalog-inventory/v1.0/service_instances/dprombnl",200,"application/json"],["GET","https://cloud.redhat.com//api/catalog-inventory/v1.0/service_offerings/hnrpwloxdh",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://cloud.redhat.com//api/catalog-inventory/v1.0/service_offerings/apsv",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://www.googletagmanager.com/gtag/js?id=G-283225060",200,"application/javascript"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=441265186&fmt=gif",204,"image/gif"],["GET","https://cdn.segment.com/analytics.js/v1/a6eddaf109d72c4e6483a8b2/analytics.min.js",200,"application/javascript"],["GET","https://cloud.redhat.com/sockjs-node/info",200,"application/json"],["POST","https://cloud.redhat.com//api/catalog-inventory/v1.0/service_offerings/bhrhj/applied_inventories_tags",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=315234787&fmt=gif",204,"image/gif"],["POST","https://cloud.redhat.com//api/catalog-inventory/v1.0/service_offerings/shlf/applied_inventories_tags",200,"application/json"],["POST","https://cloud.redhat.com//api/catalog-inventory/v1.0/service_offerings/uwhwq/applied_inventories_tags",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=358960619&fmt=gif",204,"image/gif"],["POST","https://o411120183.ingest.sentry.io/api/411120183/envelope/?sentry_key=0351b0e94e911a29df951816",200,"application/json"],["GET","https://cloud.redhat.com/config.json",200,"application/json"],["GET","https://cloud.redhat.com/static/media/logo.6fe87285.svg",200,"image/svg+xml"],["GET","https://cloud.redhat.com/__flags",200,"application/json"],["POST","https://cloud.redhat.com//api/catalog-inventory/v1.0/service_offerings/mxgi/order",200,"application/json"],["GET","https://cloud.redhat.com/ping",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-623474456&cid=623474456.623474456&en=page_view",204,"text/plain"],["GET","https://cloud.redhat.com/__flags",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://cloud.redhat.com//api/catalog-inventory/v1.0/service_offerings/ljmoq/order",200,"application/json"],["GET","https://cloud.redhat.com/favicon.ico",200,"image/x-icon"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://cloud.redhat.com//api/catalog-inventory/v1.0/service_plans/uil",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://o485665886.ingest.sentry.io/api/485665886/envelope/?sentry_key=b3491ec7c513558c529ef629",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-315983488&cid=315983488.315983488&en=page_view",204,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://cloud.redhat.com//api/catalog-inventory/v1.0/service_plans/jozrivcyb",200,"application/json"],["GET","https://cloud.redhat.com//api/catalog-inventory/v1.0/sources/sqf",200,"application/json"],["GET","https://cloud.redhat.com/ping",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-477335247&cid=477335247.477335247&en=page_view",204,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-528047533&cid=528047533.528047533&en=page_view",204,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://cloud.redhat.com//api/catalog-inventory/v1.0/sources/jgab",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-245021972.js?sv=6",200,"application/javascript"],["GET","https://cloud.redhat.com//api/catalog-inventory/v1.0/sources/olrmhz",200,"application/json"],["GET","https://cloud.redhat.com//api/catalog-inventory/v1.0/tasks/dgdmxlgu",200,"application/json"],["POST","https://o74230218.ingest.sentry.io/api/74230218/envelope/?sentry_key=be7b933b30874c726b93bed7",200,"application/json"],["GET","https://cloud.redhat.com//api/catalog-inventory/v1.0/tasks/taatdvyjdf",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://o712673438.ingest.sentry.io/api/712673438/envelope/?sentry_key=85b8b4e34fbce37f864e989b",200,"application/json"],["GET","https://cloud.redhat.com//api/catalog-inventory/v1.0/tasks/ncidftw",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-463942275&cid=463942275.463942275&en=page_view",204,"text/plain"],["POST","https://o667437441.ingest.sentry.io/api/667437441/envelope/?sentry_key=d4c4fc24a9c3b2ba1199c6ab",200,"application/json"],["GET","https://cloud.redhat.com/favicon.ico",200,"image/x-icon"],["GET","https://cdn.segment.com/analytics.js/v1/3178c114348f6622f91cceff/analytics.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://cloud.redhat.com//api/catalog-inventory/v1.0/service_credential_types/yjahxsiecn\",\n \"headers\": {\n \"host\": \"cloud.redhat.com\",\n \"connection\": \"keep-alive\",\n \"authorization\": \"Basic dXNlcl80YWZmNmJkZjpwd182MDY2YjA3MGI4YTQ4YTA3\",\n \"origin\": \"https://app.redhat.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.redhat.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"description\\\":\\\"nktygzqt\\\",\\\"id\\\":\\\"rmmko\\\",\\\"kind\\\":\\\"gmt\\\",\\\"last_seen_at\\\":\\\"2021-09-25T03:14:58Z\\\",\\\"namespace\\\":\\\"rnp\\\",\\\"refresh_state_part_id\\\":\\\"jjf\\\",\\\"source_deleted_at\\\":\\\"2021-04-07T20:48:46Z\\\",\\\"source_id\\\":\\\"bqmmb\\\"}\"\n }\n }\n}"},{"id":"rev.ai","suite":"tier_a","tier":"A","title":"Asynchronous Speech-To-Text API Documentation","goal":"# Asynchronous Speech-To-Text API Documentation\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.rev.ai/speechtotext/v1`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `get_account(self) -> Any`: Get Account\n- `get_list_of_jobs(self, limit: int | None = None, starting_after: str | None = None) -> Any`: Get List of Jobs\n- `submit_transcription_job(self, body: dict) -> Any`: Submit Transcription Job\n- `get_job_by_id(self, id: str) -> Any`: Get Job By Id\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:bearer","base_path","path_params","query_params","json_body","noise","partial_coverage"],"n_requests":20,"requests":[["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://o244942224.ingest.sentry.io/api/244942224/envelope/?sentry_key=67a46997f0a12af314d945a4",200,"application/json"],["GET","https://api.rev.ai/config.json",200,"application/json"],["GET","https://api.rev.ai/speechtotext/v1/account",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.rev.ai/speechtotext/v1/account",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.rev.ai/speechtotext/v1/jobs?limit=225&starting_after=mbthmblhh",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://api.rev.ai/speechtotext/v1/jobs",200,"application/json"],["GET","https://api.rev.ai/",200,"text/html"],["POST","https://api.rev.ai/speechtotext/v1/jobs",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-275631342&cid=275631342.275631342&en=page_view",204,"text/plain"],["GET","https://api.rev.ai/speechtotext/v1/jobs/xxgmiynmov",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-535421714&cid=535421714.535421714&en=page_view",204,"text/plain"],["GET","https://api.rev.ai/ping",200,"application/json"],["GET","https://api.rev.ai/static/media/logo.d1ad0f8b.svg",200,"image/svg+xml"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-678980719&cid=678980719.678980719&en=page_view",204,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o244942224.ingest.sentry.io/api/244942224/envelope/?sentry_key=67a46997f0a12af314d945a4\",\n \"headers\": {\n \"host\": \"o244942224.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.rev.ai\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.rev.ai/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"b0c266321ba2b41157debeff\\\"}\"\n }\n }\n}"},{"id":"shop-pro.jp","suite":"tier_a","tier":"A","title":"\u30ab\u30e9\u30fc\u30df\u30fc\u30b7\u30e7\u30c3\u30d7\u30a2\u30d7\u30ea\u30b9\u30c8\u30a2 API","goal":"# \u30ab\u30e9\u30fc\u30df\u30fc\u30b7\u30e7\u30c3\u30d7\u30a2\u30d7\u30ea\u30b9\u30c8\u30a2 API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.shop-pro.jp`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `get_shop_script_tags(self) -> Any`: \u30b9\u30af\u30ea\u30d7\u30c8\u30bf\u30b0\u306e\u53d6\u5f97\n- `create_shop_script_tag(self, body: dict | None = None) -> Any`: \u30b9\u30af\u30ea\u30d7\u30c8\u30bf\u30b0\u306e\u4f5c\u6210\n- `get_shop_script_tag(self, script_tag_id: int) -> Any`: \u30b9\u30af\u30ea\u30d7\u30c8\u30bf\u30b0\u306e\u53d6\u5f97\n- `get_inline_script_tag(self, inline_script_tag_id: int) -> Any`: \u30a4\u30f3\u30e9\u30a4\u30f3\u30b9\u30af\u30ea\u30d7\u30c8\u30bf\u30b0\u306e\u53d6\u5f97\n- `update_inline_script_tag(self, inline_script_tag_id: int, body: dict | None = None) -> Any`: \u30a4\u30f3\u30e9\u30a4\u30f3\u30b9\u30af\u30ea\u30d7\u30c8\u30bf\u30b0\u306e\u66f4\u65b0\n- `create_script_tag(self, body: dict | None = None) -> Any`: \u30b9\u30af\u30ea\u30d7\u30c8\u30bf\u30b0\u306e\u4f5c\u6210\n- `get_script_tag(self, script_tag_id: int) -> Any`: \u30b9\u30af\u30ea\u30d7\u30c8\u30bf\u30b0\u306e\u53d6\u5f97\n- `update_script_tag(self, script_tag_id: int, body: dict | None = None) -> Any`: \u30b9\u30af\u30ea\u30d7\u30c8\u30bf\u30b0\u306e\u66f4\u65b0\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:bearer","path_params","json_body","noise","partial_coverage"],"n_requests":50,"requests":[["GET","https://api.shop-pro.jp/static/media/logo.137b350b.svg",200,"image/svg+xml"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-984209831&cid=984209831.984209831&en=page_view",204,"text/plain"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.shop-pro.jp/appstore/v1/script_tags.json",200,"application/json"],["POST","https://api.shop-pro.jp/appstore/v1/script_tags.json",200,"application/json"],["GET","https://api.shop-pro.jp/static/media/logo.2e76298e.svg",200,"image/svg+xml"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.shop-pro.jp/appstore/v1/script_tags.json",200,"application/json"],["GET","https://api.shop-pro.jp/ping",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://o333785619.ingest.sentry.io/api/333785619/envelope/?sentry_key=777f023a7a458dcd59586715",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=767211890&fmt=gif",204,"image/gif"],["POST","https://api.shop-pro.jp/appstore/v1/script_tags.json",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-171332674.js?sv=6",200,"application/javascript"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.shop-pro.jp/robots.txt",200,"text/plain"],["GET","https://api.shop-pro.jp/appstore/v1/script_tags/752.json",200,"application/json"],["GET","https://api.shop-pro.jp/static/css/main.a23ffc79.css",200,"text/css"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-268919575&cid=268919575.268919575&en=page_view",204,"text/plain"],["GET","https://api.shop-pro.jp/appstore/v1/script_tags/372.json",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.shop-pro.jp/v1/inline_script_tags/263.json",200,"application/json"],["GET","https://api.shop-pro.jp/ping",200,"application/json"],["POST","https://o141730869.ingest.sentry.io/api/141730869/envelope/?sentry_key=0bae2350894ebcaf7e444942",200,"application/json"],["GET","https://api.shop-pro.jp/v1/inline_script_tags/377.json",200,"application/json"],["PUT","https://api.shop-pro.jp/v1/inline_script_tags/102.json",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-586535834&cid=586535834.586535834&en=page_view",204,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=957018963&fmt=gif",204,"image/gif"],["GET","https://fonts.gstatic.com/s/inter/v13/904609d78d621644c5a03dc8.woff2",200,"font/woff2"],["GET","https://api.shop-pro.jp/__flags",200,"application/json"],["GET","https://api.shop-pro.jp/sockjs-node/info",200,"application/json"],["POST","https://api.shop-pro.jp/v1/script_tags.json",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://api.shop-pro.jp/v1/script_tags.json",200,"application/json"],["GET","https://api.shop-pro.jp/v1/script_tags/253.json",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-855429000",200,"application/javascript"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=362851239&fmt=gif",204,"image/gif"],["PUT","https://api.shop-pro.jp/v1/script_tags/281.json",200,"application/json"],["PUT","https://api.shop-pro.jp/v1/script_tags/18.json",200,"application/json"],["PUT","https://api.shop-pro.jp/v1/script_tags/325.json",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-655660597.js?sv=6",200,"application/javascript"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.shop-pro.jp/ping",200,"application/json"],["GET","https://api.shop-pro.jp/static/css/main.63aa8fb5.css",200,"text/css"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.shop-pro.jp/manifest.json",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.shop-pro.jp/appstore/v1/script_tags.json\",\n \"headers\": {\n \"host\": \"api.shop-pro.jp\",\n \"connection\": \"keep-alive\",\n \"authorization\": \"Bearer sk_08824d92aaa3db3edc0d1541\",\n \"origin\": \"https://app.shop-pro.jp\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.shop-pro.jp/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"script_tags\\\":[{\\\"oauth_application_id\\\":312,\\\"src\\\":\\\"zupa\\\",\\\"update_date\\\":472}]}\"\n }\n }\n}"},{"id":"telematicssdk.com","suite":"tier_a","tier":"A","title":"Quick start - Telematics SDK","goal":"# Quick start - Telematics SDK\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.telematicssdk.com`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `trips_trip_details(self, track_token: str | None = None) -> Any`: Trips - trip details\n- `v1_scorings_consolidated_daily(self, device_token: str | None = None, start_date: str | None = None, end_date: str | None = None, tag: str | None = None, instance_id: str | None = None, app_id: str | None = None, company_id: str | None = None) -> Any`: /v1/Scorings/consolidated/daily\n- `user_safe_scoring_accumulated_value_v1_scorings_individual(self, start_date: str | None = None, end_date: str | None = None) -> Any`: User safe scoring - Accumulated value - v1/Scorings/individual\n- `user_safe_scoring_daily_value_v1_scorings_individual_daily(self, tag: str | None = None, start_date: str | None = None, end_date: str | None = None) -> Any`: User safe scoring - daily value - /v1/Scorings/individual/daily\n- `user_statistics_accumulated_value_v1_statistics_individual(self, start_date: str | None = None, end_date: str | None = None) -> Any`: User statistics - Accumulated value - /v1/Statistics/individual\n- `user_statistice_daily_value_v1_statistics_individual_daily(self, start_date: str | None = None, end_date: str | None = None) -> Any`: User statistice - Daily value - v1/Statistics/individual/daily\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:none","query_params","noise","partial_coverage"],"n_requests":47,"requests":[["GET","https://cdn.segment.com/analytics.js/v1/e8303c39608fd8dd4e7621ab/analytics.min.js",200,"application/javascript"],["GET","https://api.telematicssdk.com/mobilesdk/stage/track/get_track/v1?trackToken=lnblcg",200,"application/json"],["GET","https://api.telematicssdk.com/static/js/main.f1332936.js",200,"application/javascript"],["GET","https://api.telematicssdk.com/mobilesdk/stage/track/get_track/v1?trackToken=tvqr",200,"application/json"],["GET","https://api.telematicssdk.com/",200,"text/html"],["GET","https://api.telematicssdk.com/mobilesdk/stage/track/get_track/v1?trackToken=yjavcpvnc",200,"application/json"],["GET","https://api.telematicssdk.com/static/css/main.3bbe086f.css",200,"text/css"],["GET","https://api.telematicssdk.com/static/js/main.abab0a5a.js",200,"application/javascript"],["GET","https://api.telematicssdk.com/statistics/v1/Scorings/consolidated/daily?DeviceToken=abbldlibop&StartDate=fvn&EndDate=eabjjue&Tag=tfphqlim&InstanceId=wfydh&AppId=nta&CompanyId=jjaesmh",200,"application/json"],["GET","https://api.telematicssdk.com/manifest.json",200,"application/json"],["GET","https://api.telematicssdk.com/sockjs-node/info",200,"application/json"],["GET","https://api.telematicssdk.com/statistics/v1/Scorings/individual/?startDate=bhxqtg&endDate=uiad",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/6f912c1507c1db70b1188da7.woff2",200,"font/woff2"],["POST","https://o573900648.ingest.sentry.io/api/573900648/envelope/?sentry_key=a712a9030510df3c33d22a41",200,"application/json"],["GET","https://api.telematicssdk.com/robots.txt",200,"text/plain"],["GET","https://api.telematicssdk.com/statistics/v1/Scorings/individual/daily?Tag=zritgoeegq",200,"application/json"],["GET","https://api.telematicssdk.com/",200,"text/html"],["POST","https://o961036334.ingest.sentry.io/api/961036334/envelope/?sentry_key=705ab019bb53210921f9c165",200,"application/json"],["POST","https://o71715803.ingest.sentry.io/api/71715803/envelope/?sentry_key=d66690cca10030d5263678b0",200,"application/json"],["GET","https://api.telematicssdk.com/statistics/v1/Scorings/individual/daily?Tag=njsubkoke&StartDate=khbntoki",200,"application/json"],["GET","https://api.telematicssdk.com/",200,"text/html"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.telematicssdk.com/statistics/v1/Scorings/individual/daily?Tag=zvxsieg&EndDate=lndbpufi",200,"application/json"],["GET","https://api.telematicssdk.com/statistics/v1/Statistics/individual/",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.telematicssdk.com/statistics/v1/Statistics/individual/?endDate=rbanxxpp",200,"application/json"],["GET","https://api.telematicssdk.com/__flags",200,"application/json"],["GET","https://api.telematicssdk.com/__flags",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://fonts.gstatic.com/s/inter/v13/713531cdd49174c9f92cfb63.woff2",200,"font/woff2"],["GET","https://api.telematicssdk.com/statistics/v1/Statistics/individual/?startDate=vbyjn&endDate=nrjkcl",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-90775370&cid=90775370.90775370&en=page_view",204,"text/plain"],["GET","https://api.telematicssdk.com/statistics/v1/Statistics/individual/daily/",200,"application/json"],["GET","https://api.telematicssdk.com/statistics/v1/Statistics/individual/daily/?endDate=dvahzv",200,"application/json"],["GET","https://api.telematicssdk.com/",200,"text/html"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-905644975&cid=905644975.905644975&en=page_view",204,"text/plain"],["GET","https://api.telematicssdk.com/__flags",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/108205bd976b8bc5c22185d4.woff2",200,"font/woff2"],["GET","https://api.telematicssdk.com/statistics/v1/Statistics/individual/daily/?startDate=gyvasbn&endDate=ibirtgbolg",200,"application/json"],["GET","https://api.telematicssdk.com/",200,"text/html"],["GET","https://api.telematicssdk.com/static/media/logo.225a75a6.svg",200,"image/svg+xml"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-295601846&cid=295601846.295601846&en=page_view",204,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.telematicssdk.com/__flags",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.telematicssdk.com/mobilesdk/stage/track/get_track/v1?trackToken=lnblcg\",\n \"headers\": {\n \"host\": \"api.telematicssdk.com\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.telematicssdk.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.telematicssdk.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"Result\\\":{\\\"Track\\\":{\\\"AccelerationCount\\\":751.7,\\\"AddressEnd\\\":\\\"elzzpytbl\\\",\\\"AddressFinishParts\\\":{\\\"District\\\":\\\"oofgu\\\",\\\"House\\\":\\\"kuwho\\\",\\\"Street\\\":\\\"iztn\\\"},\\\"AddressStart\\\":\\\"khpx\\\",\\\"BeaconId\\\":905.25,\\\"CityStart\\\":\\\"afepxdq\\\",\\\"DecelerationCount\\\":97.05,\\\"Distance\\\":509.49,\\\"Duration\\\":591.58,\\\"EcoScoreBrakes\\\":751.22,\\\"EcoScoreDepreciation\\\":732.85,\\\"EcoScoreFuel\\\":344.21,\\\"HighOverSpeedMileage\\\":366.38,\\\"OriginChanged\\\":false,\\\"Rating\\\":842.91,\\\"RatingAcceleration\\\":209.22,\\\"RatingAcceleration100\\\":262.61,\\\"RatingBraking\\\":352.92,\\\"RatingBraking100\\\":366.23,\\\"RatingCornering\\\":425.96,\\\"RatingSpeeding100\\\":67.73,\\\"StartDate\\\":\\\"imuk\\\",\\\"Status\\\":\\\"bbrnrl\\\",\\\"TrackOriginCode\\\":\\\"phxy\\\"}}}\"\n }\n }\n}"},{"id":"twilio.com_twilio_wireless_v1","suite":"tier_a","tier":"A","title":"Twilio - Wireless","goal":"# Twilio - Wireless\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://wireless.twilio.com`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `list_command(self, sim: str | None = None, status: str | None = None, direction: str | None = None, transport: str | None = None, page_size: int | None = None, page: int | None = None, page_token: str | None = None) -> Any`: Retrieve a list of Commands from your account.\n- `fetch_command(self, sid: str) -> Any`: Fetch a Command instance from your account.\n- `list_rate_plan(self, page_size: int | None = None, page: int | None = None, page_token: str | None = None) -> Any`: GET /v1/RatePlans\n- `list_sim(self, status: str | None = None, iccid: str | None = None, rate_plan: str | None = None, e_id: str | None = None, sim_registration_code: str | None = None, page_size: int | None = None, page: int | None = None, page_token: str | None = None) -> Any`: Retrieve a list of Sim resources on your Account.\n- `fetch_sim(self, sid: str) -> Any`: Fetch a Sim resource on your Account.\n- `list_data_session(self, sim_sid: str, page_size: int | None = None, page: int | None = None, page_token: str | None = None) -> Any`: GET /v1/Sims/{SimSid}/DataSessions\n- `list_usage_record(self, sim_sid: str, end: str | None = None, start: str | None = None, granularity: str | None = None, page_size: int | None = None, page: int | None = None, page_token: str | None = None) -> Any`: GET /v1/Sims/{SimSid}/UsageRecords\n- `list_account_usage_record(self, end: str | None = None, start: str | None = None, granularity: str | None = None, page_size: int | None = None, page: int | None = None, page_token: str | None = None) -> Any`: GET /v1/UsageRecords\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:basic","path_params","query_params","noise","partial_coverage"],"n_requests":47,"requests":[["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://www.googletagmanager.com/gtag/js?id=G-355013184",200,"application/javascript"],["GET","https://wireless.twilio.com/static/js/main.60a002da.js",200,"application/javascript"],["GET","https://wireless.twilio.com/static/media/logo.06739314.svg",200,"image/svg+xml"],["GET","https://wireless.twilio.com/v1/Commands?Sim=wnx&Status=received&Direction=from_sim&Page=743&PageToken=mmrqttz",200,"application/json"],["GET","https://wireless.twilio.com/__flags",200,"application/json"],["GET","https://wireless.twilio.com/manifest.json",200,"application/json"],["POST","https://o997572513.ingest.sentry.io/api/997572513/envelope/?sentry_key=6bd9d9c7c5124b7540fab51c",200,"application/json"],["GET","https://wireless.twilio.com/v1/Commands?Status=delivered&Direction=from_sim&Transport=ip",200,"application/json"],["GET","https://wireless.twilio.com/robots.txt",200,"text/plain"],["GET","https://wireless.twilio.com/config.json",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://wireless.twilio.com/v1/Commands?Sim=yyt&Status=queued&Direction=from_sim&Transport=sms&PageSize=938&Page=209&PageToken=vfrp",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://wireless.twilio.com/v1/Commands/qmchfhbmhcxxokgjpgxapycokssziiqzfu",200,"application/json"],["GET","https://wireless.twilio.com/v1/RatePlans?Page=338&PageToken=wvxg",200,"application/json"],["GET","https://wireless.twilio.com/v1/RatePlans?Page=35",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://wireless.twilio.com/v1/RatePlans?PageSize=572&Page=943",200,"application/json"],["GET","https://wireless.twilio.com/__flags",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://wireless.twilio.com/v1/Sims?Status=deactivated&Iccid=slcxf&RatePlan=zjcnvgtyue&EId=vfqv&SimRegistrationCode=cmc&PageSize=560&Page=514&PageToken=hbhtsvn",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-228423078",200,"application/javascript"],["GET","https://wireless.twilio.com/v1/Sims/gxlx",200,"application/json"],["GET","https://wireless.twilio.com/robots.txt",200,"text/plain"],["GET","https://www.googletagmanager.com/gtag/js?id=G-888408436",200,"application/javascript"],["GET","https://wireless.twilio.com/v1/Sims/bzgavak",200,"application/json"],["GET","https://wireless.twilio.com/",200,"text/html"],["GET","https://static.hotjar.com/c/hotjar-564532298.js?sv=6",200,"application/javascript"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://wireless.twilio.com/v1/Sims/ezxpnvl/DataSessions?Page=495&PageToken=publd",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-144888201.js?sv=6",200,"application/javascript"],["GET","https://wireless.twilio.com/manifest.json",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://wireless.twilio.com/v1/Sims/jqugxil/DataSessions?PageSize=213",200,"application/json"],["GET","https://wireless.twilio.com/v1/Sims/jbamri/UsageRecords?End=2021-03-10T18%3A37%3A31Z&Start=2025-03-15T04%3A13%3A05Z&Granularity=daily&PageSize=958&Page=529&PageToken=smcndonkz",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://wireless.twilio.com/config.json",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://wireless.twilio.com/v1/UsageRecords?End=2021-04-08T19%3A54%3A52Z&Start=2024-03-02T00%3A10%3A01Z&Granularity=all&PageSize=103&Page=331&PageToken=xusbdspyf",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/6bbd8d71d3c3a9e5e84b998a.woff2",200,"font/woff2"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://wireless.twilio.com/config.json",200,"application/json"],["GET","https://wireless.twilio.com/static/js/main.f834d63a.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://wireless.twilio.com/v1/Commands?Sim=wnx&Status=received&Direction=from_sim&Page=743&PageToken=mmrqttz\",\n \"headers\": {\n \"host\": \"wireless.twilio.com\",\n \"connection\": \"keep-alive\",\n \"authorization\": \"Basic dXNlcl80MjQ0MjcwZjpwd19jYzFmYWQ5YjEyMzZlYzM2\",\n \"origin\": \"https://app.twilio.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.twilio.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"meta\\\":{\\\"key\\\":\\\"hthh\\\",\\\"page\\\":669,\\\"previous_page_url\\\":\\\"https://example.com/lknf\\\",\\\"url\\\":\\\"https://example.com/pawdohwyfc\\\"}}\"\n }\n }\n}"},{"id":"up.com.au","suite":"tier_a","tier":"A","title":"Up API","goal":"# Up API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.up.com.au/api/v1`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `list_accounts(self, page_size: int | None = None, filter_account_type: str | None = None, filter_ownership_type: str | None = None) -> Any`: List accounts\n- `retrieve_account(self, id: str) -> Any`: Retrieve account\n- `list_categories(self, filter_parent: str | None = None) -> Any`: List categories\n- `retrieve_category(self, id: str) -> Any`: Retrieve category\n- `ping(self) -> Any`: Ping\n- `create_webhook(self, body: dict | None = None) -> Any`: Create webhook\n- `retrieve_webhook(self, id: str) -> Any`: Retrieve webhook\n- `ping_webhook(self, webhook_id: str) -> Any`: Ping webhook\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:bearer","base_path","path_params","query_params","json_body","noise","partial_coverage"],"n_requests":53,"requests":[["GET","https://api.up.com.au/sockjs-node/info",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.up.com.au/api/v1/accounts?page%5Bsize%5D=87",200,"application/json"],["GET","https://api.up.com.au/api/v1/accounts?page%5Bsize%5D=191&filter%5BaccountType%5D=SAVER&filter%5BownershipType%5D=INDIVIDUAL",200,"application/json"],["GET","https://api.up.com.au/favicon.ico",200,"image/x-icon"],["GET","https://api.up.com.au/api/v1/accounts/wreumkspm",200,"application/json"],["GET","https://api.up.com.au/favicon.ico",200,"image/x-icon"],["GET","https://api.up.com.au/api/v1/accounts/cfzrn",200,"application/json"],["GET","https://api.up.com.au/manifest.json",200,"application/json"],["GET","https://api.up.com.au/api/v1/accounts/lojhrdpi",200,"application/json"],["GET","https://api.up.com.au/favicon.ico",200,"image/x-icon"],["GET","https://px.ads.linkedin.com/collect?pid=319378009&fmt=gif",204,"image/gif"],["GET","https://api.up.com.au/api/v1/categories?filter%5Bparent%5D=eeakkjzn",200,"application/json"],["GET","https://api.up.com.au/static/media/logo.0e28e383.svg",200,"image/svg+xml"],["GET","https://api.up.com.au/static/js/main.46b664ce.js",200,"application/javascript"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.up.com.au/api/v1/categories",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=326628297&fmt=gif",204,"image/gif"],["GET","https://api.up.com.au/api/v1/categories",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-507361514&cid=507361514.507361514&en=page_view",204,"text/plain"],["GET","https://api.up.com.au/static/media/logo.1ca68584.svg",200,"image/svg+xml"],["GET","https://api.up.com.au/api/v1/categories/kjimuz",200,"application/json"],["GET","https://api.up.com.au/api/v1/categories/yjbcvcoxj",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-529348865&cid=529348865.529348865&en=page_view",204,"text/plain"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.up.com.au/api/v1/util/ping",200,"application/json"],["GET","https://api.up.com.au/sockjs-node/info",200,"application/json"],["GET","https://api.up.com.au/config.json",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/c4436e30a4c39478b5d0cffe.woff2",200,"font/woff2"],["GET","https://api.up.com.au/static/js/main.18adeaae.js",200,"application/javascript"],["POST","https://api.up.com.au/api/v1/webhooks",201,"application/json"],["GET","https://api.up.com.au/ping",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/08f788fcd6bdca9398857738.woff2",200,"font/woff2"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.up.com.au/robots.txt",200,"text/plain"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://api.up.com.au/api/v1/webhooks",201,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.up.com.au/config.json",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/8098a73186788f4ebb937d62.woff2",200,"font/woff2"],["POST","https://api.up.com.au/api/v1/webhooks",201,"application/json"],["GET","https://api.up.com.au/robots.txt",200,"text/plain"],["GET","https://api.up.com.au/api/v1/webhooks/sjtklthmzi",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-138959754&cid=138959754.138959754&en=page_view",204,"text/plain"],["GET","https://api.up.com.au/favicon.ico",200,"image/x-icon"],["POST","https://api.up.com.au/api/v1/webhooks/wkaj/ping",201,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.up.com.au/config.json",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.up.com.au/sockjs-node/info\",\n \"headers\": {\n \"host\": \"api.up.com.au\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.up.com.au\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.up.com.au/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"websocket\\\":true,\\\"origins\\\":[\\\"*:*\\\"],\\\"cookie_needed\\\":false,\\\"entropy\\\":297563579}\"\n }\n }\n}"},{"id":"vonage.com_vgis","suite":"tier_a","tier":"A","title":"Vonage Integration Suite","goal":"# Vonage Integration Suite\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, api_key: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.vonage.com/t/vbc.prod/vis/v1`. Tests use another host and port.\n- `api_key` is the credential as one string. (If the API uses HTTP basic auth, it is `\"user:pass\"`.)\n\n## Methods\n\nImplement exactly these methods. Each argument is a keyword argument; `body` is the JSON\nrequest body as a `dict`. A method returns the parsed JSON response body, or `None` if the\nresponse has no body.\n\n- `get_calls_count(self, from_date: int | None = None, to_date: int | None = None, direction: str | None = None, states: str | None = None) -> Any`: Get calls count\n- `get_roles(self, id: str) -> Any`: Get a call\n- `destroy_call(self, id: str) -> Any`: End a call\n- `call_hold(self, id: str) -> Any`: Put call on hold\n- `call_transfer(self, id: str, body: dict) -> Any`: Transfer call\n- `list_events(self, types: str | None = None, from_date: int | None = None, to_date: int | None = None, direction: str | None = None, states: str | None = None, offset: int | None = None, size: int | None = None, order: str | None = None, sort: str | None = None) -> Any`: List events\n- `get_event(self, id: str) -> Any`: Get event\n- `renew_webhook(self, id: str) -> Any`: Renews a web hook\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url` and `api_key`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and a new key.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["auth:none","base_path","path_params","query_params","json_body","noise","partial_coverage"],"n_requests":50,"requests":[["GET","https://cdn.segment.com/analytics.js/v1/002270ec4f8efdc3cddd403f/analytics.min.js",200,"application/javascript"],["GET","https://www.googletagmanager.com/gtag/js?id=G-278100492",200,"application/javascript"],["GET","https://www.googletagmanager.com/gtag/js?id=G-307296394",200,"application/javascript"],["GET","https://api.vonage.com/static/js/main.820f508e.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-744707918&cid=744707918.744707918&en=page_view",204,"text/plain"],["GET","https://api.vonage.com/t/vbc.prod/vis/v1/self/calls/count?fromDate=993&direction=OUTBOUND&states=REMOTE_HELD",200,"application/json"],["GET","https://api.vonage.com/t/vbc.prod/vis/v1/self/calls/count?fromDate=878&toDate=86",200,"application/json"],["GET","https://api.vonage.com/sockjs-node/info",200,"application/json"],["GET","https://api.vonage.com/t/vbc.prod/vis/v1/self/calls/acdzoylo",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.vonage.com/t/vbc.prod/vis/v1/self/calls/ohe",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-187234365&cid=187234365.187234365&en=page_view",204,"text/plain"],["DELETE","https://api.vonage.com/t/vbc.prod/vis/v1/self/calls/ggat",200,"application/json"],["GET","https://api.vonage.com/robots.txt",200,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-721072624&cid=721072624.721072624&en=page_view",204,"text/plain"],["GET","https://api.vonage.com/static/media/logo.2f805d8d.svg",200,"image/svg+xml"],["PUT","https://api.vonage.com/t/vbc.prod/vis/v1/self/calls/ufrtfje/hold",200,"application/json"],["PUT","https://api.vonage.com/t/vbc.prod/vis/v1/self/calls/pjejx/hold",200,"application/json"],["GET","https://api.vonage.com/ping",200,"application/json"],["GET","https://api.vonage.com/ping",200,"application/json"],["PUT","https://api.vonage.com/t/vbc.prod/vis/v1/self/calls/lwf/hold",200,"application/json"],["GET","https://api.vonage.com/static/css/main.ea8e4e69.css",200,"text/css"],["POST","https://api.vonage.com/t/vbc.prod/vis/v1/self/calls/imslltr/transfer",200,"application/json"],["GET","https://api.vonage.com/static/js/main.8c6eba80.js",200,"application/javascript"],["GET","https://api.vonage.com/t/vbc.prod/vis/v1/self/events?types=CALL&fromDate=831&toDate=284&direction=INBOUND&states=MISSED&offset=809&size=670&order=DESC&sort=sbamiz",200,"application/json"],["GET","https://api.vonage.com/manifest.json",200,"application/json"],["GET","https://api.vonage.com/config.json",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-78112658&cid=78112658.78112658&en=page_view",204,"text/plain"],["GET","https://api.vonage.com/static/js/main.230f1a81.js",200,"application/javascript"],["GET","https://api.vonage.com/t/vbc.prod/vis/v1/self/events/krisgy",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.vonage.com/favicon.ico",200,"image/x-icon"],["GET","https://api.vonage.com/t/vbc.prod/vis/v1/self/events/fajbxg",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-119421992",200,"application/javascript"],["GET","https://fonts.gstatic.com/s/inter/v13/dae54a6f651191e349b51ed6.woff2",200,"font/woff2"],["PUT","https://api.vonage.com/t/vbc.prod/vis/v1/self/webhooks/cvnnw/renew",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-360568964.js?sv=6",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-339790140&cid=339790140.339790140&en=page_view",204,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["PUT","https://api.vonage.com/t/vbc.prod/vis/v1/self/webhooks/jkdlkpgmyd/renew",200,"application/json"],["POST","https://o934075985.ingest.sentry.io/api/934075985/envelope/?sentry_key=6a68d7fb5beeff7e2932150f",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["PUT","https://api.vonage.com/t/vbc.prod/vis/v1/self/webhooks/ncoqguybmj/renew",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-602605596&cid=602605596.602605596&en=page_view",204,"text/plain"],["POST","https://o68422562.ingest.sentry.io/api/68422562/envelope/?sentry_key=b9bd815d2e264560c1223da8",200,"application/json"],["GET","https://api.vonage.com/favicon.ico",200,"image/x-icon"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.vonage.com/config.json",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.vonage.com/t/vbc.prod/vis/v1/self/calls/count?fromDate=993&direction=OUTBOUND&states=REMOTE_HELD\",\n \"headers\": {\n \"host\": \"api.vonage.com\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.vonage.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.vonage.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"count\\\":504}\"\n }\n }\n}"},{"id":"tierb_00_invoices","suite":"tier_b","tier":"B","title":"Fenra Invoices API","goal":"# Fenra Invoices API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.fenra.app/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:link_header","domain:invoices","base_path","noise","envelope","login_format:json","csrf_in:header"],"n_requests":43,"requests":[["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://fonts.gstatic.com/s/inter/v13/76a5307a77d9235b43beb527.woff2",200,"font/woff2"],["GET","https://api.fenra.app/static/css/main.bfe8d240.css",200,"text/css"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.fenra.app/v3/auth/login",200,"application/json"],["GET","https://api.fenra.app/v3/records",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-921705071&cid=921705071.921705071&en=page_view",204,"text/plain"],["GET","https://api.fenra.app/v3/records?p=2",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.fenra.app/v3/records?p=3",200,"application/json"],["GET","https://api.fenra.app/manifest.json",200,"application/json"],["GET","https://api.fenra.app/v3/records?p=4",200,"application/json"],["GET","https://api.fenra.app/sockjs-node/info",200,"application/json"],["GET","https://api.fenra.app/v3/records?p=5",200,"application/json"],["POST","https://o522128271.ingest.sentry.io/api/522128271/envelope/?sentry_key=ff6d29e7e4a1d1fc2f30b678",200,"application/json"],["GET","https://api.fenra.app/static/media/logo.7a7f7952.svg",200,"image/svg+xml"],["GET","https://cdn.segment.com/analytics.js/v1/9ea7e40e1e15a1371dee06f8/analytics.min.js",200,"application/javascript"],["GET","https://api.fenra.app/ping",200,"application/json"],["GET","https://api.fenra.app/v3/records?state=sent",200,"application/json"],["POST","https://o932697945.ingest.sentry.io/api/932697945/envelope/?sentry_key=04fdfb47bc2b9ad2a9ce3e40",200,"application/json"],["GET","https://api.fenra.app/v3/records?state=sent&p=2",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-537953672&cid=537953672.537953672&en=page_view",204,"text/plain"],["POST","https://o779959614.ingest.sentry.io/api/779959614/envelope/?sentry_key=b979d5df6c11b409d7784f36",200,"application/json"],["GET","https://api.fenra.app/v3/records/INV-49458",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://o66275222.ingest.sentry.io/api/66275222/envelope/?sentry_key=9cd99f8334d9579d1924b7bd",200,"application/json"],["GET","https://api.fenra.app/v3/records/INV-30033",200,"application/json"],["GET","https://api.fenra.app/manifest.json",200,"application/json"],["GET","https://api.fenra.app/sockjs-node/info",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.fenra.app/config.json",200,"application/json"],["GET","https://api.fenra.app/",200,"text/html"],["POST","https://api.fenra.app/v3/records",201,"application/json"],["GET","https://static.hotjar.com/c/hotjar-633169430.js?sv=6",200,"application/javascript"],["GET","https://api.fenra.app/manifest.json",200,"application/json"],["PATCH","https://api.fenra.app/v3/records/INV-19564",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=96834426&fmt=gif",204,"image/gif"],["DELETE","https://api.fenra.app/v3/records/INV-48366",204,"x-unknown"],["GET","https://fonts.gstatic.com/s/inter/v13/b85151107bba902fa99998f6.woff2",200,"font/woff2"],["GET","https://api.fenra.app/static/media/logo.4dcf018b.svg",200,"image/svg+xml"],["GET","https://px.ads.linkedin.com/collect?pid=878673789&fmt=gif",204,"image/gif"],["GET","https://px.ads.linkedin.com/collect?pid=72203078&fmt=gif",204,"image/gif"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.fenra.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.fenra.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}","results":{"c1":[100.0,0.0,100.0,100.0,100.0,0.0,100.0],"c2a":[100.0,100.0,100.0,0.0,0.0,100.0,100.0],"c2b":[0.0,100.0,33.3,100.0,0.0,100.0,0.0]},"fails":{"c1":[-1,0,-1,-1,-1,0,-1],"c2a":[-1,-1,-1,0,0,-1,-1],"c2b":[0,-1,3,-1,0,-1,0]}},{"id":"tierb_01_invoices","suite":"tier_b","tier":"B","title":"Lumant Invoices API","goal":"# Lumant Invoices API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.lumant.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:offset","domain:invoices","base_path","noise","token_expiry","etag_update","hidden_header","envelope","login_format:json"],"n_requests":57,"requests":[["GET","https://px.ads.linkedin.com/collect?pid=332828055&fmt=gif",204,"image/gif"],["GET","https://api.lumant.dev/static/js/main.2a21c19c.js",200,"application/javascript"],["GET","https://api.lumant.dev/static/js/main.8b239da4.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.lumant.dev/static/media/logo.2ec7b568.svg",200,"image/svg+xml"],["GET","https://api.lumant.dev/static/css/main.5237ba86.css",200,"text/css"],["GET","https://www.googletagmanager.com/gtag/js?id=G-446130365",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.lumant.dev/v2/sessions",200,"application/json"],["GET","https://api.lumant.dev/v2/items",200,"application/json"],["GET","https://api.lumant.dev/v2/items?start=10",200,"application/json"],["GET","https://api.lumant.dev/",200,"text/html"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.lumant.dev/manifest.json",200,"application/json"],["GET","https://api.lumant.dev/v2/items?start=20",200,"application/json"],["GET","https://api.lumant.dev/v2/items?start=30",200,"application/json"],["GET","https://api.lumant.dev/robots.txt",200,"text/plain"],["GET","https://api.lumant.dev/sockjs-node/info",200,"application/json"],["GET","https://api.lumant.dev/manifest.json",200,"application/json"],["GET","https://api.lumant.dev/v2/items?state=paid",401,"application/json"],["POST","https://api.lumant.dev/v2/sessions",200,"application/json"],["GET","https://api.lumant.dev/manifest.json",200,"application/json"],["GET","https://api.lumant.dev/v2/items?state=paid",200,"application/json"],["GET","https://api.lumant.dev/v2/items?state=paid&start=10",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/7700f0f2aa09b8f1f1dcc9de/analytics.min.js",200,"application/javascript"],["GET","https://api.lumant.dev/static/css/main.79e144fe.css",200,"text/css"],["GET","https://api.lumant.dev/sockjs-node/info",200,"application/json"],["GET","https://api.lumant.dev/v2/items/INV-35896",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.lumant.dev/v2/items/INV-38667",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/446550dc9441967664f4e2f9/analytics.min.js",200,"application/javascript"],["GET","https://api.lumant.dev/static/js/main.7535a098.js",200,"application/javascript"],["GET","https://www.googletagmanager.com/gtag/js?id=G-723764988",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://www.googletagmanager.com/gtag/js?id=G-506130222",200,"application/javascript"],["POST","https://api.lumant.dev/v2/items",401,"application/json"],["POST","https://api.lumant.dev/v2/sessions",200,"application/json"],["POST","https://api.lumant.dev/v2/items",201,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.lumant.dev/v2/items/INV-57027",200,"application/json"],["PATCH","https://api.lumant.dev/v2/items/INV-57027",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-652704590",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.lumant.dev/sockjs-node/info",200,"application/json"],["GET","https://api.lumant.dev/__flags",200,"application/json"],["DELETE","https://api.lumant.dev/v2/items/INV-42788",204,"x-unknown"],["GET","https://api.lumant.dev/static/media/logo.53b7e62f.svg",200,"image/svg+xml"],["GET","https://api.lumant.dev/sockjs-node/info",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.lumant.dev/ping",200,"application/json"],["GET","https://api.lumant.dev/",200,"text/html"],["GET","https://api.lumant.dev/manifest.json",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/58d5b24681f11cc1a8d372a5.woff2",200,"font/woff2"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.lumant.dev/v2/sessions\",\n \"headers\": {\n \"host\": \"api.lumant.dev\",\n \"connection\": \"keep-alive\",\n \"x-app-build\": \"2381\",\n \"origin\": \"https://app.lumant.dev\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.lumant.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"token\\\":\\\"tok_e471e2f7c25d25be134d0608\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c1":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2a":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2b":[100.0,0.0,100.0,0.0,0.0,100.0,0.0]},"fails":{"c1":[1,1,1,2,1,3,3],"c2a":[1,3,1,1,3,3,3],"c2b":[-1,1,-1,3,1,-1,1]}},{"id":"tierb_02_samples","suite":"tier_b","tier":"B","title":"Keslo Samples API","goal":"# Keslo Samples API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.keslo.dev/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:link_header","domain:samples","base_path","noise","hidden_header","envelope"],"n_requests":40,"requests":[["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.keslo.dev/static/css/main.04d92f18.css",200,"text/css"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/bed701a86d9050a5041c5f6b/analytics.min.js",200,"application/javascript"],["GET","https://www.googletagmanager.com/gtag/js?id=G-300901567",200,"application/javascript"],["POST","https://o239158883.ingest.sentry.io/api/239158883/envelope/?sentry_key=1d3b82b62ee48348b1d233b1",200,"application/json"],["GET","https://api.keslo.dev/v1/items",200,"application/json"],["GET","https://api.keslo.dev/v1/items?page=2",200,"application/json"],["GET","https://api.keslo.dev/v1/items?page=3",200,"application/json"],["GET","https://api.keslo.dev/v1/items?page=4",200,"application/json"],["GET","https://api.keslo.dev/ping",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-734121806",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/1956c5c57cfb90ea0146b9e3/analytics.min.js",200,"application/javascript"],["GET","https://api.keslo.dev/v1/items?page=5",200,"application/json"],["GET","https://api.keslo.dev/",200,"text/html"],["GET","https://api.keslo.dev/v1/items?lab=harbor",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-994111495",200,"application/javascript"],["GET","https://api.keslo.dev/v1/items?lab=harbor&page=2",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-490058089&cid=490058089.490058089&en=page_view",204,"text/plain"],["GET","https://api.keslo.dev/favicon.ico",200,"image/x-icon"],["GET","https://api.keslo.dev/",200,"text/html"],["GET","https://www.googletagmanager.com/gtag/js?id=G-607851590",200,"application/javascript"],["POST","https://o184170507.ingest.sentry.io/api/184170507/envelope/?sentry_key=7d552994dcbe61dccb41f699",200,"application/json"],["GET","https://api.keslo.dev/v1/items/SMP-50399",200,"application/json"],["GET","https://api.keslo.dev/sockjs-node/info",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/2071348556bc496be0515180.woff2",200,"font/woff2"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.keslo.dev/v1/items/SMP-94096",200,"application/json"],["GET","https://api.keslo.dev/static/css/main.9ce9e831.css",200,"text/css"],["GET","https://cdn.segment.com/analytics.js/v1/3e4da4f1cca3f2f5aad6e3ce/analytics.min.js",200,"application/javascript"],["POST","https://api.keslo.dev/v1/items",201,"application/json"],["GET","https://api.keslo.dev/sockjs-node/info",200,"application/json"],["PATCH","https://api.keslo.dev/v1/items/SMP-88923",200,"application/json"],["GET","https://api.keslo.dev/ping",200,"application/json"],["POST","https://o555962651.ingest.sentry.io/api/555962651/envelope/?sentry_key=47f76000cc8e55d4c8765107",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["DELETE","https://api.keslo.dev/v1/items/SMP-63383",204,"x-unknown"],["GET","https://api.keslo.dev/static/media/logo.5f4970bb.svg",200,"image/svg+xml"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o239158883.ingest.sentry.io/api/239158883/envelope/?sentry_key=1d3b82b62ee48348b1d233b1\",\n \"headers\": {\n \"host\": \"o239158883.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.keslo.dev\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.keslo.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"6453ccddfbf7f5c597cc1f78\\\"}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,100.0,0.0,71.4],"c2a":[100.0,100.0,100.0,100.0,0.0,100.0,0.0],"c2b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c1":[-1,-1,-1,-1,-1,0,2],"c2a":[-1,-1,-1,-1,0,-1,0]}},{"id":"tierb_03_bookings","suite":"tier_b","tier":"B","title":"Pelra Bookings API","goal":"# Pelra Bookings API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pelra.co/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:bookings","base_path","noise","hidden_header","envelope","login_format:form"],"n_requests":27,"requests":[["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://o368102594.ingest.sentry.io/api/368102594/envelope/?sentry_key=75d93712de74f7f574e8b746",200,"application/json"],["POST","https://api.pelra.co/v2/auth/login",200,"application/json"],["GET","https://api.pelra.co/v2/records",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.pelra.co/v2/records?room=Ember",200,"application/json"],["GET","https://api.pelra.co/robots.txt",200,"text/plain"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-401374286&cid=401374286.401374286&en=page_view",204,"text/plain"],["GET","https://api.pelra.co/v2/records/BKG-82877",200,"application/json"],["GET","https://api.pelra.co/ping",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.pelra.co/v2/records/BKG-17527",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-407334640&cid=407334640.407334640&en=page_view",204,"text/plain"],["POST","https://api.pelra.co/v2/records",201,"application/json"],["PATCH","https://api.pelra.co/v2/records/BKG-97728",200,"application/json"],["GET","https://api.pelra.co/sockjs-node/info",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["DELETE","https://api.pelra.co/v2/records/BKG-29281",204,"x-unknown"],["GET","https://api.pelra.co/static/media/logo.a28fabe5.svg",200,"image/svg+xml"],["GET","https://api.pelra.co/__flags",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://www.googletagmanager.com/gtag/js?id=G-588243672",200,"application/javascript"],["GET","https://api.pelra.co/static/js/main.488041c4.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o368102594.ingest.sentry.io/api/368102594/envelope/?sentry_key=75d93712de74f7f574e8b746\",\n \"headers\": {\n \"host\": \"o368102594.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.pelra.co\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pelra.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"ac810e408eb49cd985fbc16f\\\"}\"\n }\n }\n}","results":{"c1":[0.0,0.0,100.0,0.0,0.0,0.0,0.0],"c2a":[0.0,0.0,100.0,100.0,0.0,0.0,0.0],"c2b":[100.0,100.0,100.0,0.0,100.0,0.0,0.0]},"fails":{"c1":[1,1,-1,3,3,1,3],"c2a":[1,1,-1,-1,3,3,3],"c2b":[-1,-1,-1,3,-1,8,3]}},{"id":"tierb_04_invoices","suite":"tier_b","tier":"B","title":"Mirly Invoices API","goal":"# Mirly Invoices API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.mirly.co/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:invoices","base_path","noise","token_expiry","etag_update","login_format:json","csrf_in:header"],"n_requests":57,"requests":[["POST","https://o551428555.ingest.sentry.io/api/551428555/envelope/?sentry_key=2ff8e721b2934aeb865e1fca",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://o331229657.ingest.sentry.io/api/331229657/envelope/?sentry_key=0c26dd8445ad57f572121c59",200,"application/json"],["GET","https://api.mirly.co/robots.txt",200,"text/plain"],["POST","https://api.mirly.co/api/auth/token",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-234961287&cid=234961287.234961287&en=page_view",204,"text/plain"],["GET","https://api.mirly.co/api/items",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-253435859",200,"application/javascript"],["GET","https://api.mirly.co/api/items?after=NTE2YzAxN2I6MTA",200,"application/json"],["GET","https://api.mirly.co/api/items?after=NTE2YzAxN2I6MjA",200,"application/json"],["GET","https://api.mirly.co/api/items?after=NTE2YzAxN2I6MzA",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.mirly.co/config.json",200,"application/json"],["POST","https://o884560380.ingest.sentry.io/api/884560380/envelope/?sentry_key=5648641e1224d0f90b65de2c",200,"application/json"],["GET","https://api.mirly.co/api/items?state=paid",401,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-915628163&cid=915628163.915628163&en=page_view",204,"text/plain"],["POST","https://api.mirly.co/api/auth/token",200,"application/json"],["GET","https://api.mirly.co/api/items?state=paid",200,"application/json"],["GET","https://api.mirly.co/api/items?state=paid&after=NTE2YzAxN2I6MTA",200,"application/json"],["POST","https://o157565928.ingest.sentry.io/api/157565928/envelope/?sentry_key=d504e3c7b8d138a39b96f019",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=577810300&fmt=gif",204,"image/gif"],["GET","https://api.mirly.co/api/items/INV-87966",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/f799e32a85a4ec63ea126e51.woff2",200,"font/woff2"],["GET","https://api.mirly.co/__flags",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.mirly.co/api/items/INV-25155",200,"application/json"],["GET","https://api.mirly.co/static/media/logo.2844fc36.svg",200,"image/svg+xml"],["GET","https://api.mirly.co/robots.txt",200,"text/plain"],["POST","https://o247844554.ingest.sentry.io/api/247844554/envelope/?sentry_key=0031858cc8a16848e08e4413",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.mirly.co/manifest.json",200,"application/json"],["GET","https://api.mirly.co/static/js/main.2672086a.js",200,"application/javascript"],["GET","https://api.mirly.co/config.json",200,"application/json"],["POST","https://api.mirly.co/api/items",401,"application/json"],["GET","https://api.mirly.co/sockjs-node/info",200,"application/json"],["POST","https://api.mirly.co/api/auth/token",200,"application/json"],["POST","https://api.mirly.co/api/items",201,"application/json"],["GET","https://static.hotjar.com/c/hotjar-110645559.js?sv=6",200,"application/javascript"],["GET","https://api.mirly.co/__flags",200,"application/json"],["GET","https://api.mirly.co/api/items/INV-41061",200,"application/json"],["GET","https://api.mirly.co/robots.txt",200,"text/plain"],["PATCH","https://api.mirly.co/api/items/INV-41061",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-923566974.js?sv=6",200,"application/javascript"],["GET","https://api.mirly.co/favicon.ico",200,"image/x-icon"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.mirly.co/manifest.json",200,"application/json"],["GET","https://api.mirly.co/manifest.json",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.mirly.co/static/media/logo.61aa2fde.svg",200,"image/svg+xml"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.mirly.co/sockjs-node/info",200,"application/json"],["DELETE","https://api.mirly.co/api/items/INV-46538",204,"x-unknown"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.mirly.co/favicon.ico",200,"image/x-icon"],["GET","https://api.mirly.co/static/media/logo.db18432b.svg",200,"image/svg+xml"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-221465171&cid=221465171.221465171&en=page_view",204,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o551428555.ingest.sentry.io/api/551428555/envelope/?sentry_key=2ff8e721b2934aeb865e1fca\",\n \"headers\": {\n \"host\": \"o551428555.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.mirly.co\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.mirly.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"788d78e5672efcf8beeb5ced\\\"}\"\n }\n }\n}","results":{"c1":[100.0,100.0,95.2,0.0,100.0,100.0,0.0],"c2a":[100.0,0.0,100.0,100.0,100.0,85.7,100.0],"c2b":[100.0,85.7,100.0,100.0,100.0,100.0,0.0]},"fails":{"c1":[-1,-1,4,4,-1,-1,3],"c2a":[-1,3,-1,-1,-1,5,-1],"c2b":[-1,5,-1,-1,-1,-1,4]}},{"id":"tierb_05_tickets","suite":"tier_b","tier":"B","title":"Trara Tickets API","goal":"# Trara Tickets API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.trara.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:tickets","base_path","noise","hidden_header","login_format:form","csrf_in:json"],"n_requests":33,"requests":[["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.trara.dev/favicon.ico",200,"image/x-icon"],["GET","https://api.trara.dev/static/media/logo.3a1362b6.svg",200,"image/svg+xml"],["POST","https://api.trara.dev/v2/login",200,"application/json"],["GET","https://api.trara.dev/v2/records",200,"application/json"],["GET","https://api.trara.dev/v2/records?offset=10",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-489453074",200,"application/javascript"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.trara.dev/v2/records?offset=20",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.trara.dev/",200,"text/html"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.trara.dev/v2/records?priority=urgent",200,"application/json"],["GET","https://api.trara.dev/",200,"text/html"],["GET","https://api.trara.dev/v2/records/TCK-74770",200,"application/json"],["GET","https://api.trara.dev/v2/records/TCK-43153",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.trara.dev/config.json",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-886606933",200,"application/javascript"],["POST","https://api.trara.dev/v2/records",201,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.trara.dev/__flags",200,"application/json"],["GET","https://api.trara.dev/config.json",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=693830539&fmt=gif",204,"image/gif"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["PATCH","https://api.trara.dev/v2/records/TCK-75880",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/4402cb0705e37e5a07cfd304.woff2",200,"font/woff2"],["DELETE","https://api.trara.dev/v2/records/TCK-70522",204,"x-unknown"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.trara.dev/manifest.json",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://o381401627.ingest.sentry.io/api/381401627/envelope/?sentry_key=1638cd72864fcf67e479dc31",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.trara.dev/v2/login\",\n \"headers\": {\n \"host\": \"api.trara.dev\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-09-04\",\n \"origin\": \"https://app.trara.dev\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.trara.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"user\\\":\\\"user_5fa5c258\\\",\\\"csrf_token\\\":\\\"a63a71ff9be7a7af\\\"}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,57.1,100.0,0.0],"c2a":[0.0,0.0,100.0,0.0,100.0,100.0,0.0],"c2b":[100.0,100.0,100.0,0.0,100.0,100.0,100.0]},"fails":{"c1":[-1,-1,-1,-1,3,-1,3],"c2a":[3,3,-1,3,-1,-1,3],"c2b":[-1,-1,-1,2,-1,-1,-1]}},{"id":"tierb_06_samples","suite":"tier_b","tier":"B","title":"Solant Samples API","goal":"# Solant Samples API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.solant.dev/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:samples","base_path","noise","token_expiry","login_format:json"],"n_requests":53,"requests":[["GET","https://api.solant.dev/",200,"text/html"],["GET","https://api.solant.dev/",200,"text/html"],["GET","https://api.solant.dev/ping",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.solant.dev/manifest.json",200,"application/json"],["GET","https://api.solant.dev/robots.txt",200,"text/plain"],["GET","https://api.solant.dev/static/media/logo.2e7b7f5a.svg",200,"image/svg+xml"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://o96658566.ingest.sentry.io/api/96658566/envelope/?sentry_key=aafbc1c4f63e5c3be54ff1af",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.solant.dev/v3/login",200,"application/json"],["GET","https://api.solant.dev/v3/samples",200,"application/json"],["GET","https://api.solant.dev/v3/samples?cursor=ZDAzYmVlMWM6MTA",200,"application/json"],["GET","https://api.solant.dev/v3/samples?cursor=ZDAzYmVlMWM6MjA",200,"application/json"],["GET","https://api.solant.dev/v3/samples?cursor=ZDAzYmVlMWM6MzA",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.solant.dev/static/media/logo.636f3eef.svg",200,"image/svg+xml"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.solant.dev/v3/samples?lab=summit",401,"application/json"],["POST","https://api.solant.dev/v3/login",200,"application/json"],["GET","https://api.solant.dev/v3/samples?lab=summit",200,"application/json"],["GET","https://api.solant.dev/v3/samples?lab=summit&cursor=ZDAzYmVlMWM6MTA",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.solant.dev/robots.txt",200,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-230141892&cid=230141892.230141892&en=page_view",204,"text/plain"],["GET","https://static.hotjar.com/c/hotjar-134687532.js?sv=6",200,"application/javascript"],["GET","https://api.solant.dev/v3/samples/SMP-65776",200,"application/json"],["GET","https://api.solant.dev/",200,"text/html"],["GET","https://api.solant.dev/__flags",200,"application/json"],["GET","https://api.solant.dev/v3/samples/SMP-42296",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=514115004&fmt=gif",204,"image/gif"],["POST","https://api.solant.dev/v3/samples",401,"application/json"],["GET","https://api.solant.dev/robots.txt",200,"text/plain"],["POST","https://api.solant.dev/v3/login",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.solant.dev/v3/samples",201,"application/json"],["PATCH","https://api.solant.dev/v3/samples/SMP-79395",200,"application/json"],["GET","https://api.solant.dev/static/media/logo.4e08c00d.svg",200,"image/svg+xml"],["GET","https://api.solant.dev/config.json",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/0d739d966776de2ca999a15d/analytics.min.js",200,"application/javascript"],["GET","https://api.solant.dev/__flags",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["DELETE","https://api.solant.dev/v3/samples/SMP-89910",204,"x-unknown"],["GET","https://api.solant.dev/static/js/main.438a8712.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=718822795&fmt=gif",204,"image/gif"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.solant.dev/static/media/logo.795011e2.svg",200,"image/svg+xml"],["GET","https://api.solant.dev/config.json",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.solant.dev/__flags",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.solant.dev/ping\",\n \"headers\": {\n \"host\": \"api.solant.dev\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.solant.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.solant.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"status\\\":\\\"ok\\\",\\\"t\\\":415214833}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,100.0,100.0,100.0],"c2a":[100.0,100.0,100.0,100.0,100.0,100.0,0.0],"c2b":[100.0,100.0,100.0,100.0,100.0,100.0,0.0]},"fails":{"c2a":[-1,-1,-1,-1,-1,-1,4],"c2b":[-1,-1,-1,-1,-1,-1,2]}},{"id":"tierb_07_shipments","suite":"tier_b","tier":"B","title":"Havik Shipments API","goal":"# Havik Shipments API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havik.co/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:link_header","domain:shipments","base_path","noise","token_expiry","hidden_header","login_format:form","csrf_in:header"],"n_requests":53,"requests":[["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://static.hotjar.com/c/hotjar-19320426.js?sv=6",200,"application/javascript"],["POST","https://o554954791.ingest.sentry.io/api/554954791/envelope/?sentry_key=f8fa92b665345956864777f4",200,"application/json"],["POST","https://o221543045.ingest.sentry.io/api/221543045/envelope/?sentry_key=739334b9321a927964ae4980",200,"application/json"],["POST","https://api.havik.co/v1/login",200,"application/json"],["GET","https://api.havik.co/v1/shipments",200,"application/json"],["GET","https://api.havik.co/v1/shipments?p=2",200,"application/json"],["GET","https://api.havik.co/v1/shipments?p=3",200,"application/json"],["GET","https://api.havik.co/v1/shipments?p=4",200,"application/json"],["POST","https://o729472338.ingest.sentry.io/api/729472338/envelope/?sentry_key=0968ce1222b2da80ae91fb86",200,"application/json"],["GET","https://api.havik.co/",200,"text/html"],["GET","https://api.havik.co/ping",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.havik.co/v1/shipments?status=in_transit",401,"application/json"],["GET","https://api.havik.co/config.json",200,"application/json"],["POST","https://api.havik.co/v1/login",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.havik.co/v1/shipments?status=in_transit",200,"application/json"],["GET","https://api.havik.co/v1/shipments?status=in_transit&p=2",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=358659331&fmt=gif",204,"image/gif"],["GET","https://api.havik.co/__flags",200,"application/json"],["GET","https://api.havik.co/__flags",200,"application/json"],["GET","https://api.havik.co/static/media/logo.83f82ffb.svg",200,"image/svg+xml"],["GET","https://cdn.segment.com/analytics.js/v1/1ff5913edd32dc43c55e75dd/analytics.min.js",200,"application/javascript"],["GET","https://api.havik.co/v1/shipments/SHP-20637",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=708792438&fmt=gif",204,"image/gif"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.havik.co/v1/shipments/SHP-48884",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://static.hotjar.com/c/hotjar-258849353.js?sv=6",200,"application/javascript"],["GET","https://api.havik.co/robots.txt",200,"text/plain"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=517624379&fmt=gif",204,"image/gif"],["GET","https://api.havik.co/__flags",200,"application/json"],["POST","https://api.havik.co/v1/shipments",401,"application/json"],["POST","https://api.havik.co/v1/login",200,"application/json"],["POST","https://api.havik.co/v1/shipments",201,"application/json"],["GET","https://api.havik.co/config.json",200,"application/json"],["GET","https://api.havik.co/",200,"text/html"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.havik.co/static/js/main.68195070.js",200,"application/javascript"],["PATCH","https://api.havik.co/v1/shipments/SHP-34591",200,"application/json"],["GET","https://api.havik.co/static/media/logo.f22062e1.svg",200,"image/svg+xml"],["GET","https://px.ads.linkedin.com/collect?pid=770785805&fmt=gif",204,"image/gif"],["DELETE","https://api.havik.co/v1/shipments/SHP-19065",204,"x-unknown"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=115004328&fmt=gif",204,"image/gif"],["GET","https://api.havik.co/robots.txt",200,"text/plain"],["GET","https://api.havik.co/static/media/logo.154197c7.svg",200,"image/svg+xml"],["GET","https://www.googletagmanager.com/gtag/js?id=G-150594609",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.havik.co\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havik.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}","results":{"c1":[0.0,0.0,33.3,0.0,0.0,100.0,0.0],"c2a":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2b":[0.0,0.0,100.0,0.0,0.0,100.0,0.0]},"fails":{"c1":[1,1,1,3,3,-1,3],"c2a":[1,3,1,3,3,3,3],"c2b":[3,3,-1,2,3,-1,3]}},{"id":"tierb_08_invoices","suite":"tier_b","tier":"B","title":"Kesrix Invoices API","goal":"# Kesrix Invoices API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.kesrix.io/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:link_header","domain:invoices","base_path","noise","envelope"],"n_requests":37,"requests":[["GET","https://static.hotjar.com/c/hotjar-384090610.js?sv=6",200,"application/javascript"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.kesrix.io/v2/invoices",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-480380242",200,"application/javascript"],["GET","https://api.kesrix.io/v2/invoices?page=2",200,"application/json"],["GET","https://api.kesrix.io/static/media/logo.60b037b7.svg",200,"image/svg+xml"],["GET","https://api.kesrix.io/v2/invoices?page=3",200,"application/json"],["GET","https://api.kesrix.io/v2/invoices?page=4",200,"application/json"],["POST","https://o491891818.ingest.sentry.io/api/491891818/envelope/?sentry_key=dc224ba810953fdd866e6620",200,"application/json"],["GET","https://api.kesrix.io/ping",200,"application/json"],["GET","https://api.kesrix.io/v2/invoices?state=draft",200,"application/json"],["GET","https://api.kesrix.io/v2/invoices?state=draft&page=2",200,"application/json"],["GET","https://api.kesrix.io/robots.txt",200,"text/plain"],["GET","https://api.kesrix.io/",200,"text/html"],["GET","https://api.kesrix.io/favicon.ico",200,"image/x-icon"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-685269514&cid=685269514.685269514&en=page_view",204,"text/plain"],["GET","https://api.kesrix.io/sockjs-node/info",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.kesrix.io/v2/invoices/INV-81315",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.kesrix.io/v2/invoices/INV-74036",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.kesrix.io/v2/invoices",201,"application/json"],["GET","https://api.kesrix.io/static/media/logo.dbdcceb1.svg",200,"image/svg+xml"],["GET","https://api.kesrix.io/sockjs-node/info",200,"application/json"],["GET","https://api.kesrix.io/static/js/main.179deb7a.js",200,"application/javascript"],["PATCH","https://api.kesrix.io/v2/invoices/INV-17496",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.kesrix.io/ping",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-999812257&cid=999812257.999812257&en=page_view",204,"text/plain"],["DELETE","https://api.kesrix.io/v2/invoices/INV-62495",204,"x-unknown"],["GET","https://px.ads.linkedin.com/collect?pid=371873985&fmt=gif",204,"image/gif"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.kesrix.io/manifest.json",200,"application/json"],["POST","https://o539266950.ingest.sentry.io/api/539266950/envelope/?sentry_key=d33b3615e7ba57fbc74b5fd6",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.kesrix.io/v2/invoices\",\n \"headers\": {\n \"host\": \"api.kesrix.io\",\n \"connection\": \"keep-alive\",\n \"x-auth-key\": \"sk_e07356d2cb232f45ee8b3ee8\",\n \"origin\": \"https://app.kesrix.io\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.kesrix.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"INV-54590\\\",\\\"created_at\\\":\\\"2026-01-05T14:03:00Z\\\",\\\"customer\\\":\\\"Brightwater Co\\\",\\\"state\\\":\\\"sent\\\",\\\"amount_cents\\\":671738,\\\"currency\\\":\\\"USD\\\",\\\"due_date\\\":\\\"2026-06-21\\\",\\\"memo\\\":\\\"Cannot reset two-factor device\\\"},{\\\"id\\\":\\\"INV-78853\\\",\\\"created_at\\\":\\\"2026-01-05T16:01:00Z\\\",\\\"customer\\\":\\\"Ostrava Tools\\\",\\\"state\\\":\\\"void\\\",\\\"amount_cents\\\":50320,\\\"currency\\\":\\\"EUR\\\",\\\"due_date\\\":\\\"2026-04-04\\\",\\\"memo\\\":\\\"Export fails for archived projects\\\"},{\\\"id\\\":\\\"INV-33339\\\",\\\"created_at\\\":\\\"2026-01-05T17:28:00Z\\\",\\\"customer\\\":\\\"Mosaic Freight\\\",\\\"state\\\":\\\"paid\\\",\\\"amount_cents\\\":74977,\\\"currency\\\":\\\"USD\\\",\\\"due_date\\\":\\\"2026-02-13\\\",\\\"memo\\\":\\\"Mobile app logs users out\\\"},{\\\"id\\\":\\\"INV-93996\\\",\\\"created_at\\\":\\\"2026-01-05T18:36:00Z\\\",\\\"customer\\\":\\\"Mosaic Freight\\\",\\\"state\\\":\\\"d\"","results":{"c1":[100.0,100.0,100.0,100.0,100.0,100.0,0.0],"c2a":[0.0,100.0,0.0,100.0,71.4,100.0,100.0],"c2b":[100.0,71.4,100.0,100.0,71.4,100.0,0.0]},"fails":{"c1":[-1,-1,-1,-1,-1,-1,0],"c2a":[0,-1,3,-1,2,-1,-1],"c2b":[-1,2,-1,-1,2,-1,0]}},{"id":"tierb_09_tickets","suite":"tier_b","tier":"B","title":"Solium Tickets API","goal":"# Solium Tickets API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.solium.net/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:none","domain:tickets","base_path","noise"],"n_requests":23,"requests":[["GET","https://api.solium.net/manifest.json",200,"application/json"],["GET","https://api.solium.net/config.json",200,"application/json"],["GET","https://api.solium.net/v1/tickets",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/6c04d5642e362ba26f1beb7b/analytics.min.js",200,"application/javascript"],["GET","https://static.hotjar.com/c/hotjar-622177750.js?sv=6",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.solium.net/v1/tickets?priority=normal",200,"application/json"],["GET","https://api.solium.net/favicon.ico",200,"image/x-icon"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.solium.net/v1/tickets/TCK-59945",200,"application/json"],["GET","https://api.solium.net/favicon.ico",200,"image/x-icon"],["GET","https://api.solium.net/static/js/main.622570a1.js",200,"application/javascript"],["GET","https://api.solium.net/v1/tickets/TCK-25454",200,"application/json"],["GET","https://api.solium.net/manifest.json",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://api.solium.net/v1/tickets",201,"application/json"],["POST","https://o45697962.ingest.sentry.io/api/45697962/envelope/?sentry_key=12258c3bc314670307e396c7",200,"application/json"],["GET","https://api.solium.net/static/media/logo.802b1632.svg",200,"image/svg+xml"],["GET","https://api.solium.net/__flags",200,"application/json"],["PATCH","https://api.solium.net/v1/tickets/TCK-55464",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["DELETE","https://api.solium.net/v1/tickets/TCK-52602",204,"x-unknown"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.solium.net/manifest.json\",\n \"headers\": {\n \"host\": \"api.solium.net\",\n \"connection\": \"keep-alive\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"manifest\",\n \"referer\": \"https://app.solium.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"short_name\\\":\\\"App\\\",\\\"start_url\\\":\\\".\\\",\\\"display\\\":\\\"standalone\\\",\\\"icons\\\":[]}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,100.0,100.0,100.0],"c2a":[100.0,100.0,100.0,100.0,100.0,100.0,100.0],"c2b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]}},{"id":"tierb_10_bookings","suite":"tier_b","tier":"B","title":"Velora Bookings API","goal":"# Velora Bookings API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.velora.co/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:link_header","domain:bookings","base_path","noise","etag_update","login_format:json","csrf_in:header"],"n_requests":43,"requests":[["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://o894907343.ingest.sentry.io/api/894907343/envelope/?sentry_key=4cf286e0fff580fd60c10570",200,"application/json"],["GET","https://api.velora.co/ping",200,"application/json"],["GET","https://api.velora.co/config.json",200,"application/json"],["POST","https://api.velora.co/v2/login",200,"application/json"],["GET","https://api.velora.co/v2/records",200,"application/json"],["GET","https://api.velora.co/v2/records?page=2",200,"application/json"],["GET","https://api.velora.co/ping",200,"application/json"],["GET","https://api.velora.co/v2/records?page=3",200,"application/json"],["GET","https://api.velora.co/v2/records?page=4",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/6f52853e5ae2cdd7f7a28dee/analytics.min.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.velora.co/",200,"text/html"],["GET","https://api.velora.co/v2/records?room=Birch",200,"application/json"],["GET","https://api.velora.co/v2/records?room=Birch&page=2",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-59140101",200,"application/javascript"],["GET","https://api.velora.co/v2/records/BKG-36253",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.velora.co/static/js/main.6493bbf3.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://o160150426.ingest.sentry.io/api/160150426/envelope/?sentry_key=a48933bceea3aad5ce2d2856",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=256022670&fmt=gif",204,"image/gif"],["GET","https://api.velora.co/v2/records/BKG-24526",200,"application/json"],["GET","https://api.velora.co/manifest.json",200,"application/json"],["POST","https://api.velora.co/v2/records",201,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.velora.co/static/js/main.5331bbb2.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.velora.co/v2/records/BKG-95443",200,"application/json"],["PATCH","https://api.velora.co/v2/records/BKG-95443",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.velora.co/manifest.json",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/5e6f8bea0fa36402eea5c8c9/analytics.min.js",200,"application/javascript"],["GET","https://api.velora.co/favicon.ico",200,"image/x-icon"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["DELETE","https://api.velora.co/v2/records/BKG-35211",204,"x-unknown"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.velora.co/ping",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.velora.co/favicon.ico",200,"image/x-icon"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o894907343.ingest.sentry.io/api/894907343/envelope/?sentry_key=4cf286e0fff580fd60c10570\",\n \"headers\": {\n \"host\": \"o894907343.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.velora.co\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.velora.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"67dc75230127881e472d1e42\\\"}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,0.0,0.0,85.7,0.0],"c2a":[100.0,100.0,100.0,0.0,100.0,0.0,85.7],"c2b":[0.0,100.0,66.7,0.0,0.0,71.4,100.0]},"fails":{"c1":[-1,-1,-1,3,0,5,0],"c2a":[-1,-1,-1,0,-1,0,5],"c2b":[0,-1,0,0,3,3,-1]}},{"id":"tierb_11_tickets","suite":"tier_b","tier":"B","title":"Brovo Tickets API","goal":"# Brovo Tickets API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.brovo.dev/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:tickets","base_path","noise","etag_update","envelope"],"n_requests":43,"requests":[["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.brovo.dev/favicon.ico",200,"image/x-icon"],["GET","https://api.brovo.dev/ping",200,"application/json"],["GET","https://api.brovo.dev/api/records",200,"application/json"],["GET","https://api.brovo.dev/api/records?after=OGY1NjJkYWM6MTA",200,"application/json"],["GET","https://api.brovo.dev/api/records?after=OGY1NjJkYWM6MjA",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-205041504",200,"application/javascript"],["GET","https://api.brovo.dev/api/records?after=OGY1NjJkYWM6MzA",200,"application/json"],["GET","https://api.brovo.dev/api/records?after=OGY1NjJkYWM6NDA",200,"application/json"],["POST","https://o695080879.ingest.sentry.io/api/695080879/envelope/?sentry_key=d71756a71e7815ce6ca75c3e",200,"application/json"],["GET","https://api.brovo.dev/config.json",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.brovo.dev/api/records?priority=urgent",200,"application/json"],["GET","https://api.brovo.dev/api/records?priority=urgent&after=OGY1NjJkYWM6MTA",200,"application/json"],["GET","https://api.brovo.dev/static/js/main.a09333e2.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://fonts.gstatic.com/s/inter/v13/ec0d8aa263db8f15392394e2.woff2",200,"font/woff2"],["GET","https://api.brovo.dev/robots.txt",200,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.brovo.dev/api/records/TCK-79138",200,"application/json"],["POST","https://o849328213.ingest.sentry.io/api/849328213/envelope/?sentry_key=4df803979ce478d3e8808b44",200,"application/json"],["GET","https://api.brovo.dev/api/records/TCK-78328",200,"application/json"],["GET","https://api.brovo.dev/manifest.json",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-497142742",200,"application/javascript"],["GET","https://api.brovo.dev/manifest.json",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-64337120",200,"application/javascript"],["GET","https://api.brovo.dev/favicon.ico",200,"image/x-icon"],["POST","https://api.brovo.dev/api/records",201,"application/json"],["GET","https://api.brovo.dev/robots.txt",200,"text/plain"],["GET","https://api.brovo.dev/manifest.json",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.brovo.dev/api/records/TCK-46084",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["PATCH","https://api.brovo.dev/api/records/TCK-46084",200,"application/json"],["DELETE","https://api.brovo.dev/api/records/TCK-83768",204,"x-unknown"],["GET","https://api.brovo.dev/",200,"text/html"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-206173862&cid=206173862.206173862&en=page_view",204,"text/plain"],["GET","https://api.brovo.dev/ping",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=44762010&fmt=gif",204,"image/gif"],["GET","https://api.brovo.dev/ping",200,"application/json"],["GET","https://api.brovo.dev/favicon.ico",200,"image/x-icon"],["GET","https://api.brovo.dev/static/css/main.2839ed23.css",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=489761846&fmt=gif",204,"image/gif"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.brovo.dev/ping\",\n \"headers\": {\n \"host\": \"api.brovo.dev\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.brovo.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.brovo.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"status\\\":\\\"ok\\\",\\\"t\\\":183269003}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,100.0,100.0,85.7],"c2a":[100.0,100.0,100.0,85.7,85.7,100.0,85.7],"c2b":[85.7,100.0,100.0,100.0,85.7,100.0,85.7]},"fails":{"c1":[-1,-1,-1,-1,-1,-1,5],"c2a":[-1,-1,-1,5,5,-1,5],"c2b":[5,-1,-1,-1,5,-1,5]}},{"id":"tierb_12_samples","suite":"tier_b","tier":"B","title":"Broant Samples API","goal":"# Broant Samples API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.broant.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:link_header","domain:samples","base_path","noise","etag_update","hidden_header","envelope"],"n_requests":40,"requests":[["GET","https://api.broant.dev/favicon.ico",200,"image/x-icon"],["GET","https://api.broant.dev/v2/records",200,"application/json"],["GET","https://api.broant.dev/v2/records?page=2",200,"application/json"],["GET","https://api.broant.dev/v2/records?page=3",200,"application/json"],["GET","https://api.broant.dev/static/js/main.ae7ce9fe.js",200,"application/javascript"],["GET","https://api.broant.dev/v2/records?page=4",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.broant.dev/v2/records?lab=north",200,"application/json"],["GET","https://api.broant.dev/robots.txt",200,"text/plain"],["GET","https://api.broant.dev/v2/records?lab=north&page=2",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-610143491&cid=610143491.610143491&en=page_view",204,"text/plain"],["GET","https://api.broant.dev/v2/records/SMP-78948",200,"application/json"],["GET","https://api.broant.dev/config.json",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=205997979&fmt=gif",204,"image/gif"],["GET","https://api.broant.dev/v2/records/SMP-55021",200,"application/json"],["GET","https://api.broant.dev/manifest.json",200,"application/json"],["GET","https://api.broant.dev/manifest.json",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.broant.dev/static/css/main.12dbcd74.css",200,"text/css"],["POST","https://api.broant.dev/v2/records",201,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-678995916.js?sv=6",200,"application/javascript"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.broant.dev/manifest.json",200,"application/json"],["GET","https://api.broant.dev/static/js/main.4203fd94.js",200,"application/javascript"],["GET","https://api.broant.dev/v2/records/SMP-82177",200,"application/json"],["PATCH","https://api.broant.dev/v2/records/SMP-82177",200,"application/json"],["POST","https://o118906388.ingest.sentry.io/api/118906388/envelope/?sentry_key=e76ad579b500ddf44a79402a",200,"application/json"],["GET","https://api.broant.dev/config.json",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-662467300&cid=662467300.662467300&en=page_view",204,"text/plain"],["DELETE","https://api.broant.dev/v2/records/SMP-56506",204,"x-unknown"],["GET","https://static.hotjar.com/c/hotjar-481925858.js?sv=6",200,"application/javascript"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.broant.dev/manifest.json",200,"application/json"],["POST","https://o306601789.ingest.sentry.io/api/306601789/envelope/?sentry_key=843c4fd0f44113fe22d05b60",200,"application/json"],["GET","https://api.broant.dev/config.json",200,"application/json"],["GET","https://api.broant.dev/sockjs-node/info",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.broant.dev/v2/records\",\n \"headers\": {\n \"host\": \"api.broant.dev\",\n \"connection\": \"keep-alive\",\n \"x-app-build\": \"5456\",\n \"x-api-token\": \"sk_a183e9b50e0d5105a3808054\",\n \"origin\": \"https://app.broant.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.broant.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"SMP-89197\\\",\\\"created_at\\\":\\\"2026-01-05T18:09:00Z\\\",\\\"assay\\\":\\\"elisa\\\",\\\"lab\\\":\\\"north\\\",\\\"volume_ul\\\":181.8,\\\"collected_on\\\":\\\"2026-10-12\\\",\\\"batch\\\":\\\"B-8756\\\",\\\"hazardous\\\":false},{\\\"id\\\":\\\"SMP-21608\\\",\\\"created_at\\\":\\\"2026-01-05T18:51:00Z\\\",\\\"assay\\\":\\\"elisa\\\",\\\"lab\\\":\\\"harbor\\\",\\\"volume_ul\\\":273.9,\\\"collected_on\\\":\\\"2026-11-18\\\",\\\"batch\\\":\\\"B-8752\\\",\\\"hazardous\\\":true},{\\\"id\\\":\\\"SMP-75957\\\",\\\"created_at\\\":\\\"2026-01-05T19:51:00Z\\\",\\\"assay\\\":\\\"cytometry\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":41.4,\\\"collected_on\\\":\\\"2026-07-03\\\",\\\"batch\\\":\\\"B-7933\\\",\\\"hazardous\\\":false},{\\\"id\\\":\\\"SMP-96107\\\",\\\"created_at\\\":\\\"2026-01-05T21:27:00Z\\\",\\\"assay\\\":\\\"cytometry\\\",\\\"lab\\\":\\\"north\\\",\\\"volume_ul\\\":581.4,\\\"collected_on\\\":\\\"2026-03-26\\\",\\\"batch\\\":\\\"B-9965\\\",\\\"","results":{"c1":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2a":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2b":[0.0,0.0,100.0,0.0,0.0,85.7,0.0]},"fails":{"c1":[1,1,1,1,1,1,1],"c2a":[1,1,1,1,1,1,1],"c2b":[1,3,-1,1,1,5,1]}},{"id":"tierb_13_invoices","suite":"tier_b","tier":"B","title":"Fenrix Invoices API","goal":"# Fenrix Invoices API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.fenrix.app/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:invoices","base_path","noise","hidden_header","login_format:json"],"n_requests":33,"requests":[["GET","https://px.ads.linkedin.com/collect?pid=53173191&fmt=gif",204,"image/gif"],["GET","https://www.googletagmanager.com/gtag/js?id=G-297679630",200,"application/javascript"],["GET","https://api.fenrix.app/",200,"text/html"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=456628890&fmt=gif",204,"image/gif"],["POST","https://api.fenrix.app/v1/auth/token",200,"application/json"],["GET","https://api.fenrix.app/v1/invoices",200,"application/json"],["GET","https://api.fenrix.app/v1/invoices?after=MDk5MTdhNmM6MTA",200,"application/json"],["GET","https://api.fenrix.app/v1/invoices?after=MDk5MTdhNmM6MjA",200,"application/json"],["GET","https://api.fenrix.app/manifest.json",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-161169447&cid=161169447.161169447&en=page_view",204,"text/plain"],["GET","https://api.fenrix.app/v1/invoices?state=draft",200,"application/json"],["GET","https://api.fenrix.app/sockjs-node/info",200,"application/json"],["GET","https://api.fenrix.app/v1/invoices/INV-36830",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.fenrix.app/v1/invoices/INV-87864",200,"application/json"],["GET","https://api.fenrix.app/static/js/main.8e44ba18.js",200,"application/javascript"],["GET","https://api.fenrix.app/static/media/logo.b14ba599.svg",200,"image/svg+xml"],["POST","https://api.fenrix.app/v1/invoices",201,"application/json"],["GET","https://static.hotjar.com/c/hotjar-511916683.js?sv=6",200,"application/javascript"],["GET","https://www.googletagmanager.com/gtag/js?id=G-813172736",200,"application/javascript"],["GET","https://fonts.gstatic.com/s/inter/v13/9021645c62fac1b126f56027.woff2",200,"font/woff2"],["GET","https://api.fenrix.app/ping",200,"application/json"],["PATCH","https://api.fenrix.app/v1/invoices/INV-97997",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=974021752&fmt=gif",204,"image/gif"],["GET","https://api.fenrix.app/__flags",200,"application/json"],["GET","https://api.fenrix.app/",200,"text/html"],["DELETE","https://api.fenrix.app/v1/invoices/INV-19175",204,"x-unknown"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/52cdb9decf94552d507383c6/analytics.min.js",200,"application/javascript"],["GET","https://api.fenrix.app/robots.txt",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.fenrix.app/v1/auth/token\",\n \"headers\": {\n \"host\": \"api.fenrix.app\",\n \"connection\": \"keep-alive\",\n \"x-api-version\": \"2024-10-10\",\n \"origin\": \"https://app.fenrix.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.fenrix.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"token\\\":\\\"tok_982a56fe71b7492fd908f4d1\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,0.0,100.0,100.0,0.0],"c2a":[100.0,100.0,100.0,100.0,0.0,100.0,0.0],"c2b":[0.0,100.0,100.0,0.0,85.7,100.0,100.0]},"fails":{"c1":[-1,-1,-1,2,-1,-1,3],"c2a":[-1,-1,-1,-1,2,-1,3],"c2b":[3,-1,-1,2,6,-1,-1]}},{"id":"tierb_14_samples","suite":"tier_b","tier":"B","title":"Mirra Samples API","goal":"# Mirra Samples API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.mirra.app/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:samples","base_path","noise","etag_update","login_format:form"],"n_requests":47,"requests":[["GET","https://api.mirra.app/__flags",200,"application/json"],["GET","https://api.mirra.app/",200,"text/html"],["GET","https://api.mirra.app/config.json",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.mirra.app/v2/auth/token",200,"application/json"],["GET","https://api.mirra.app/v2/items",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-542992624",200,"application/javascript"],["GET","https://api.mirra.app/v2/items?cursor=NmM2Njc2YTc6MTA",200,"application/json"],["GET","https://api.mirra.app/v2/items?cursor=NmM2Njc2YTc6MjA",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.mirra.app/v2/items?cursor=NmM2Njc2YTc6MzA",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-913776976.js?sv=6",200,"application/javascript"],["GET","https://api.mirra.app/v2/items?cursor=NmM2Njc2YTc6NDA",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.mirra.app/static/media/logo.544fade8.svg",200,"image/svg+xml"],["GET","https://api.mirra.app/v2/items?lab=harbor",200,"application/json"],["GET","https://api.mirra.app/v2/items?lab=harbor&cursor=NmM2Njc2YTc6MTA",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://o756925775.ingest.sentry.io/api/756925775/envelope/?sentry_key=9178bc9aa4fd88a6ae7a8357",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=163599170&fmt=gif",204,"image/gif"],["GET","https://api.mirra.app/v2/items/SMP-89094",200,"application/json"],["GET","https://api.mirra.app/sockjs-node/info",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.mirra.app/v2/items/SMP-88572",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://static.hotjar.com/c/hotjar-843671716.js?sv=6",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/4bfb4154321674edd8feacd2/analytics.min.js",200,"application/javascript"],["POST","https://api.mirra.app/v2/items",201,"application/json"],["GET","https://api.mirra.app/",200,"text/html"],["GET","https://api.mirra.app/static/css/main.16bf3a54.css",200,"text/css"],["GET","https://api.mirra.app/v2/items/SMP-22475",200,"application/json"],["PATCH","https://api.mirra.app/v2/items/SMP-22475",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.mirra.app/robots.txt",200,"text/plain"],["GET","https://static.hotjar.com/c/hotjar-985119976.js?sv=6",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["DELETE","https://api.mirra.app/v2/items/SMP-40710",204,"x-unknown"],["POST","https://o994958836.ingest.sentry.io/api/994958836/envelope/?sentry_key=c7e805dbf18fc8e71266cf8a",200,"application/json"],["GET","https://api.mirra.app/__flags",200,"application/json"],["GET","https://api.mirra.app/config.json",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/a94960f01039c80ecea15032.woff2",200,"font/woff2"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.mirra.app/__flags\",\n \"headers\": {\n \"host\": \"api.mirra.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.mirra.app\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.mirra.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"15ef6a95\\\"}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,0.0,100.0,85.7],"c2a":[85.7,100.0,0.0,85.7,100.0,100.0,100.0],"c2b":[100.0,100.0,100.0,85.7,0.0,100.0,85.7]},"fails":{"c1":[-1,-1,-1,-1,3,-1,5],"c2a":[5,-1,3,5,-1,-1,-1],"c2b":[-1,-1,-1,5,2,-1,5]}},{"id":"tierb_15_bookings","suite":"tier_b","tier":"B","title":"Zanrix Bookings API","goal":"# Zanrix Bookings API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.zanrix.co/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:bookings","base_path","noise","etag_update","hidden_header","envelope","login_format:form","csrf_in:json"],"n_requests":47,"requests":[["GET","https://px.ads.linkedin.com/collect?pid=390748236&fmt=gif",204,"image/gif"],["GET","https://api.zanrix.co/favicon.ico",200,"image/x-icon"],["GET","https://api.zanrix.co/",200,"text/html"],["GET","https://api.zanrix.co/",200,"text/html"],["GET","https://api.zanrix.co/static/js/main.821b8b6b.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-449365774&cid=449365774.449365774&en=page_view",204,"text/plain"],["GET","https://api.zanrix.co/__flags",200,"application/json"],["GET","https://api.zanrix.co/static/media/logo.62b7c91e.svg",200,"image/svg+xml"],["GET","https://api.zanrix.co/__flags",200,"application/json"],["POST","https://api.zanrix.co/api/sessions",200,"application/json"],["GET","https://api.zanrix.co/api/records",200,"application/json"],["GET","https://api.zanrix.co/api/records?after=OGM0M2YzM2I6MTA",200,"application/json"],["GET","https://api.zanrix.co/api/records?after=OGM0M2YzM2I6MjA",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.zanrix.co/api/records?after=OGM0M2YzM2I6MzA",200,"application/json"],["GET","https://api.zanrix.co/api/records?after=OGM0M2YzM2I6NDA",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=793242614&fmt=gif",204,"image/gif"],["GET","https://api.zanrix.co/api/records?room=Dune",200,"application/json"],["GET","https://api.zanrix.co/api/records?room=Dune&after=OGM0M2YzM2I6MTA",200,"application/json"],["GET","https://api.zanrix.co/sockjs-node/info",200,"application/json"],["GET","https://api.zanrix.co/api/records/BKG-34060",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.zanrix.co/favicon.ico",200,"image/x-icon"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.zanrix.co/api/records/BKG-89990",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.zanrix.co/api/records",201,"application/json"],["GET","https://api.zanrix.co/ping",200,"application/json"],["POST","https://o158345403.ingest.sentry.io/api/158345403/envelope/?sentry_key=f9edbb8bc92c8ab7cdea10c2",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/5aff9058461720272c721a0d.woff2",200,"font/woff2"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.zanrix.co/api/records/BKG-37665",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["PATCH","https://api.zanrix.co/api/records/BKG-37665",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["DELETE","https://api.zanrix.co/api/records/BKG-44347",204,"x-unknown"],["POST","https://o721991247.ingest.sentry.io/api/721991247/envelope/?sentry_key=5b0d0754778f87c7ecc226ee",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=357433756&fmt=gif",204,"image/gif"],["GET","https://api.zanrix.co/config.json",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.zanrix.co/__flags\",\n \"headers\": {\n \"host\": \"api.zanrix.co\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.zanrix.co\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.zanrix.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"e67886ea\\\"}\"\n }\n }\n}","results":{"c1":[0.0,0.0,33.3,0.0,100.0,0.0,0.0],"c2a":[0.0,0.0,0.0,0.0,0.0,100.0,0.0],"c2b":[0.0,100.0,100.0,0.0,0.0,0.0,0.0]},"fails":{"c1":[3,1,1,3,-1,3,3],"c2a":[3,1,3,3,3,-1,3],"c2b":[3,-1,-1,3,3,3,3]}},{"id":"tierb_16_samples","suite":"tier_b","tier":"B","title":"Broly Samples API","goal":"# Broly Samples API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.broly.com/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:samples","base_path","noise","etag_update","login_format:form","csrf_in:json"],"n_requests":47,"requests":[["GET","https://api.broly.com/",200,"text/html"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.broly.com/robots.txt",200,"text/plain"],["GET","https://api.broly.com/config.json",200,"application/json"],["GET","https://api.broly.com/ping",200,"application/json"],["GET","https://api.broly.com/static/css/main.4fdf51ca.css",200,"text/css"],["POST","https://api.broly.com/api/auth/token",200,"application/json"],["GET","https://api.broly.com/api/records",200,"application/json"],["GET","https://api.broly.com/api/records?offset=10",200,"application/json"],["GET","https://api.broly.com/api/records?offset=20",200,"application/json"],["GET","https://api.broly.com/api/records?offset=30",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.broly.com/static/media/logo.4c9b2d57.svg",200,"image/svg+xml"],["GET","https://fonts.gstatic.com/s/inter/v13/4889f237d2d827144fbb545d.woff2",200,"font/woff2"],["GET","https://api.broly.com/",200,"text/html"],["GET","https://fonts.gstatic.com/s/inter/v13/543e8c49053678f532248e07.woff2",200,"font/woff2"],["GET","https://api.broly.com/api/records?lab=summit",200,"application/json"],["GET","https://api.broly.com/api/records?lab=summit&offset=10",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/3ae433210defe8097191a3ab.woff2",200,"font/woff2"],["GET","https://api.broly.com/api/records?lab=summit&offset=20",200,"application/json"],["GET","https://api.broly.com/static/js/main.c957e05b.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=199498337&fmt=gif",204,"image/gif"],["GET","https://api.broly.com/static/media/logo.d4a07a59.svg",200,"image/svg+xml"],["GET","https://fonts.gstatic.com/s/inter/v13/1e79d4f99d4e42bc5b4993bd.woff2",200,"font/woff2"],["GET","https://api.broly.com/api/records/SMP-72009",200,"application/json"],["GET","https://api.broly.com/__flags",200,"application/json"],["GET","https://api.broly.com/static/css/main.323c4d2a.css",200,"text/css"],["GET","https://api.broly.com/robots.txt",200,"text/plain"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.broly.com/api/records/SMP-89356",200,"application/json"],["POST","https://o867066801.ingest.sentry.io/api/867066801/envelope/?sentry_key=fcbeaba9fd83bba44c810037",200,"application/json"],["GET","https://api.broly.com/config.json",200,"application/json"],["POST","https://api.broly.com/api/records",201,"application/json"],["GET","https://api.broly.com/static/js/main.1f07375e.js",200,"application/javascript"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.broly.com/api/records/SMP-53429",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-842381780&cid=842381780.842381780&en=page_view",204,"text/plain"],["PATCH","https://api.broly.com/api/records/SMP-53429",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/be956afcc8701f17b3f7d4ae.woff2",200,"font/woff2"],["GET","https://www.googletagmanager.com/gtag/js?id=G-605649527",200,"application/javascript"],["GET","https://static.hotjar.com/c/hotjar-458715077.js?sv=6",200,"application/javascript"],["GET","https://api.broly.com/manifest.json",200,"application/json"],["DELETE","https://api.broly.com/api/records/SMP-27538",204,"x-unknown"],["GET","https://api.broly.com/sockjs-node/info",200,"application/json"],["GET","https://api.broly.com/",200,"text/html"],["GET","https://api.broly.com/static/css/main.50078d67.css",200,"text/css"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.broly.com/config.json\",\n \"headers\": {\n \"host\": \"api.broly.com\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.broly.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.broly.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"a439ae39\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,0.0,85.7,100.0,85.7],"c2a":[100.0,100.0,0.0,100.0,100.0,100.0,85.7],"c2b":[100.0,100.0,100.0,100.0,0.0,100.0,100.0]},"fails":{"c1":[-1,-1,-1,3,5,-1,5],"c2a":[-1,-1,3,-1,-1,-1,5],"c2b":[-1,-1,-1,-1,3,-1,-1]}},{"id":"tierb_17_shipments","suite":"tier_b","tier":"B","title":"Kesra Shipments API","goal":"# Kesra Shipments API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.kesra.net/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:shipments","base_path","noise","hidden_header","envelope"],"n_requests":37,"requests":[["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://o63183486.ingest.sentry.io/api/63183486/envelope/?sentry_key=25a94520053fc4dbc18fdbd5",200,"application/json"],["GET","https://api.kesra.net/robots.txt",200,"text/plain"],["POST","https://o815830686.ingest.sentry.io/api/815830686/envelope/?sentry_key=388166d17770b89e68f2c611",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.kesra.net/v1/shipments",200,"application/json"],["GET","https://api.kesra.net/v1/shipments?after=NWJhNTFjNmM6MTA",200,"application/json"],["GET","https://api.kesra.net/v1/shipments?after=NWJhNTFjNmM6MjA",200,"application/json"],["GET","https://api.kesra.net/v1/shipments?after=NWJhNTFjNmM6MzA",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.kesra.net/config.json",200,"application/json"],["GET","https://api.kesra.net/ping",200,"application/json"],["GET","https://api.kesra.net/static/js/main.990df59a.js",200,"application/javascript"],["GET","https://api.kesra.net/v1/shipments?status=returned",200,"application/json"],["GET","https://api.kesra.net/v1/shipments?status=returned&after=NWJhNTFjNmM6MTA",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-341679440.js?sv=6",200,"application/javascript"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://fonts.gstatic.com/s/inter/v13/67b0a6c178affb0db6961016.woff2",200,"font/woff2"],["GET","https://api.kesra.net/v1/shipments/SHP-42583",200,"application/json"],["GET","https://api.kesra.net/static/css/main.fbaa5c2b.css",200,"text/css"],["POST","https://o929302795.ingest.sentry.io/api/929302795/envelope/?sentry_key=f76fb9867c14f14a89dc2efa",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-208050954&cid=208050954.208050954&en=page_view",204,"text/plain"],["GET","https://api.kesra.net/v1/shipments/SHP-89896",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.kesra.net/v1/shipments",201,"application/json"],["GET","https://api.kesra.net/__flags",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["PATCH","https://api.kesra.net/v1/shipments/SHP-32754",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=812109791&fmt=gif",204,"image/gif"],["GET","https://api.kesra.net/sockjs-node/info",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["DELETE","https://api.kesra.net/v1/shipments/SHP-26191",204,"x-unknown"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.kesra.net/static/media/logo.b29ea8fd.svg",200,"image/svg+xml"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o63183486.ingest.sentry.io/api/63183486/envelope/?sentry_key=25a94520053fc4dbc18fdbd5\",\n \"headers\": {\n \"host\": \"o63183486.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.kesra.net\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.kesra.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"bd0bee8007ab5b115d1a1112\\\"}\"\n }\n }\n}","results":{"c1":[0.0,100.0,66.7,0.0,0.0,100.0,0.0],"c2a":[100.0,0.0,0.0,100.0,100.0,100.0,0.0],"c2b":[100.0,100.0,100.0,0.0,100.0,100.0,0.0]},"fails":{"c1":[1,-1,1,1,1,-1,1],"c2a":[-1,1,3,-1,-1,-1,1],"c2b":[-1,-1,-1,2,-1,-1,1]}},{"id":"tierb_18_tickets","suite":"tier_b","tier":"B","title":"Trana Tickets API","goal":"# Trana Tickets API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.trana.io/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:offset","domain:tickets","base_path","noise","token_expiry","envelope","login_format:json"],"n_requests":53,"requests":[["GET","https://api.trana.io/static/media/logo.092d5979.svg",200,"image/svg+xml"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://www.googletagmanager.com/gtag/js?id=G-63021190",200,"application/javascript"],["GET","https://api.trana.io/static/css/main.bb8a45a9.css",200,"text/css"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.trana.io/static/media/logo.29b96d0a.svg",200,"image/svg+xml"],["POST","https://api.trana.io/v1/auth/login",200,"application/json"],["GET","https://api.trana.io/__flags",200,"application/json"],["GET","https://api.trana.io/v1/tickets",200,"application/json"],["GET","https://api.trana.io/v1/tickets?start=10",200,"application/json"],["GET","https://api.trana.io/v1/tickets?start=20",200,"application/json"],["GET","https://api.trana.io/v1/tickets?start=30",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/4e3c0f9517b3f3e8a31df676.woff2",200,"font/woff2"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.trana.io/ping",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.trana.io/v1/tickets?priority=normal",401,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=489271779&fmt=gif",204,"image/gif"],["POST","https://api.trana.io/v1/auth/login",200,"application/json"],["GET","https://api.trana.io/v1/tickets?priority=normal",200,"application/json"],["GET","https://api.trana.io/v1/tickets?priority=normal&start=10",200,"application/json"],["GET","https://api.trana.io/favicon.ico",200,"image/x-icon"],["GET","https://api.trana.io/robots.txt",200,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=960807159&fmt=gif",204,"image/gif"],["GET","https://api.trana.io/v1/tickets/TCK-50174",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/babc1b197a35ab750c68eb7c.woff2",200,"font/woff2"],["GET","https://api.trana.io/static/media/logo.a75bf440.svg",200,"image/svg+xml"],["GET","https://api.trana.io/__flags",200,"application/json"],["GET","https://api.trana.io/v1/tickets/TCK-71364",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.trana.io/favicon.ico",200,"image/x-icon"],["POST","https://api.trana.io/v1/tickets",401,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://api.trana.io/v1/auth/login",200,"application/json"],["POST","https://api.trana.io/v1/tickets",201,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.trana.io/favicon.ico",200,"image/x-icon"],["GET","https://api.trana.io/static/css/main.fbb7d773.css",200,"text/css"],["GET","https://api.trana.io/static/css/main.17db7f86.css",200,"text/css"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.trana.io/static/js/main.1ebe97da.js",200,"application/javascript"],["PATCH","https://api.trana.io/v1/tickets/TCK-69829",200,"application/json"],["DELETE","https://api.trana.io/v1/tickets/TCK-40259",204,"x-unknown"],["GET","https://api.trana.io/manifest.json",200,"application/json"],["GET","https://api.trana.io/favicon.ico",200,"image/x-icon"],["GET","https://api.trana.io/ping",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-747605029&cid=747605029.747605029&en=page_view",204,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=127076368&fmt=gif",204,"image/gif"],["GET","https://api.trana.io/config.json",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/c4539e37f3e57ec6b0cca560/analytics.min.js",200,"application/javascript"],["GET","https://api.trana.io/ping",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.trana.io/v1/auth/login\",\n \"headers\": {\n \"host\": \"api.trana.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.trana.io\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.trana.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"access_token\\\":\\\"tok_533a49c200650038de5706bc\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,100.0,100.0,0.0],"c2a":[100.0,100.0,100.0,100.0,100.0,100.0,14.3],"c2b":[100.0,100.0,100.0,100.0,100.0,100.0,14.3]},"fails":{"c1":[-1,-1,-1,-1,-1,-1,3],"c2a":[-1,-1,-1,-1,-1,-1,4],"c2b":[-1,-1,-1,-1,-1,-1,4]}},{"id":"tierb_19_bookings","suite":"tier_b","tier":"B","title":"Quolo Bookings API","goal":"# Quolo Bookings API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quolo.app/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:offset","domain:bookings","base_path","noise","envelope","login_format:form"],"n_requests":40,"requests":[["POST","https://o36628073.ingest.sentry.io/api/36628073/envelope/?sentry_key=a6fd78028f8f8b3373ee1186",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.quolo.app/__flags",200,"application/json"],["GET","https://api.quolo.app/static/media/logo.ec369cf0.svg",200,"image/svg+xml"],["GET","https://fonts.gstatic.com/s/inter/v13/e6b88cb9a9086e3f392e7a83.woff2",200,"font/woff2"],["GET","https://api.quolo.app/ping",200,"application/json"],["GET","https://api.quolo.app/static/js/main.f4e07d4e.js",200,"application/javascript"],["POST","https://api.quolo.app/api/auth/token",200,"application/json"],["GET","https://api.quolo.app/api/items",200,"application/json"],["GET","https://api.quolo.app/api/items?start=10",200,"application/json"],["GET","https://api.quolo.app/api/items?start=20",200,"application/json"],["GET","https://api.quolo.app/api/items?start=30",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.quolo.app/api/items?room=Aurora",200,"application/json"],["GET","https://api.quolo.app/api/items?room=Aurora&start=10",200,"application/json"],["GET","https://api.quolo.app/favicon.ico",200,"image/x-icon"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.quolo.app/config.json",200,"application/json"],["GET","https://api.quolo.app/robots.txt",200,"text/plain"],["GET","https://api.quolo.app/api/items/BKG-56406",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.quolo.app/api/items/BKG-25903",200,"application/json"],["POST","https://api.quolo.app/api/items",201,"application/json"],["GET","https://api.quolo.app/favicon.ico",200,"image/x-icon"],["GET","https://px.ads.linkedin.com/collect?pid=970071219&fmt=gif",204,"image/gif"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["PATCH","https://api.quolo.app/api/items/BKG-35399",200,"application/json"],["GET","https://api.quolo.app/manifest.json",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-796898925.js?sv=6",200,"application/javascript"],["GET","https://api.quolo.app/",200,"text/html"],["GET","https://api.quolo.app/static/css/main.4bb065f0.css",200,"text/css"],["GET","https://api.quolo.app/config.json",200,"application/json"],["DELETE","https://api.quolo.app/api/items/BKG-40625",204,"x-unknown"],["GET","https://api.quolo.app/static/css/main.4ae1ee96.css",200,"text/css"],["GET","https://www.googletagmanager.com/gtag/js?id=G-13094769",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=513745668&fmt=gif",204,"image/gif"],["GET","https://fonts.gstatic.com/s/inter/v13/95c9170e0cbda0c8323797cd.woff2",200,"font/woff2"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o36628073.ingest.sentry.io/api/36628073/envelope/?sentry_key=a6fd78028f8f8b3373ee1186\",\n \"headers\": {\n \"host\": \"o36628073.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.quolo.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.quolo.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"780bf5f8230f8d878e83c113\\\"}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,100.0,100.0,100.0],"c2a":[100.0,100.0,0.0,0.0,100.0,100.0,100.0],"c2b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c2a":[-1,-1,3,3,-1,-1,-1]}},{"id":"tierb_20_invoices","suite":"tier_b","tier":"B","title":"Trana Invoices API","goal":"# Trana Invoices API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.trana.dev/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:none","domain:invoices","base_path","noise"],"n_requests":23,"requests":[["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.trana.dev/static/css/main.fbeb3ff7.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.trana.dev/static/js/main.9b0ddfd9.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.trana.dev/api/records",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.trana.dev/api/records?state=void",200,"application/json"],["GET","https://api.trana.dev/config.json",200,"application/json"],["GET","https://api.trana.dev/api/records/INV-65817",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.trana.dev/api/records/INV-15692",200,"application/json"],["POST","https://api.trana.dev/api/records",201,"application/json"],["GET","https://api.trana.dev/favicon.ico",200,"image/x-icon"],["GET","https://api.trana.dev/manifest.json",200,"application/json"],["PATCH","https://api.trana.dev/api/records/INV-72642",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-959593656&cid=959593656.959593656&en=page_view",204,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["DELETE","https://api.trana.dev/api/records/INV-17725",204,"x-unknown"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.trana.dev/ping",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.trana.dev/api/records\",\n \"headers\": {\n \"host\": \"api.trana.dev\",\n \"connection\": \"keep-alive\",\n \"x-api-key\": \"sk_2cf42deadba8ae6ffae543d7\",\n \"origin\": \"https://app.trana.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.trana.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"[{\\\"id\\\":\\\"INV-16513\\\",\\\"created_at\\\":\\\"2026-01-05T13:41:00Z\\\",\\\"customer\\\":\\\"Lumen & Sons\\\",\\\"state\\\":\\\"void\\\",\\\"amount_cents\\\":842836,\\\"currency\\\":\\\"GBP\\\",\\\"due_date\\\":\\\"2026-09-25\\\",\\\"memo\\\":\\\"Invoice PDF misses the tax line\\\"},{\\\"id\\\":\\\"INV-35846\\\",\\\"created_at\\\":\\\"2026-01-05T14:19:00Z\\\",\\\"customer\\\":\\\"Halden Works\\\",\\\"state\\\":\\\"void\\\",\\\"amount_cents\\\":472149,\\\"currency\\\":\\\"EUR\\\",\\\"due_date\\\":\\\"2026-11-08\\\",\\\"memo\\\":\\\"Mobile app logs users out\\\"},{\\\"id\\\":\\\"INV-28708\\\",\\\"created_at\\\":\\\"2026-01-05T15:27:00Z\\\",\\\"customer\\\":\\\"Halden Works\\\",\\\"state\\\":\\\"sent\\\",\\\"amount_cents\\\":205918,\\\"currency\\\":\\\"GBP\\\",\\\"due_date\\\":\\\"2026-02-24\\\",\\\"memo\\\":\\\"Export fails for archived projects\\\"},{\\\"id\\\":\\\"INV-65020\\\",\\\"created_at\\\":\\\"2026-01-05T15:53:00Z\\\",\\\"customer\\\":\\\"Lumen & Sons\\\",\\\"state\\\":\\\"void\\\",\\\"amount\"\n","results":{"c1":[100.0,100.0,100.0,100.0,100.0,100.0,100.0],"c2a":[100.0,100.0,100.0,100.0,100.0,100.0,100.0],"c2b":[100.0,100.0,100.0,100.0,0.0,100.0,100.0]},"fails":{"c2b":[-1,-1,-1,-1,0,-1,-1]}},{"id":"tierb_21_tickets","suite":"tier_b","tier":"B","title":"Brodex Tickets API","goal":"# Brodex Tickets API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.brodex.com/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:tickets","base_path","noise","etag_update","envelope","login_format:json"],"n_requests":30,"requests":[["POST","https://o23861411.ingest.sentry.io/api/23861411/envelope/?sentry_key=dc11ce316df3ee486c2827a6",200,"application/json"],["GET","https://api.brodex.com/",200,"text/html"],["GET","https://api.brodex.com/",200,"text/html"],["GET","https://api.brodex.com/ping",200,"application/json"],["POST","https://api.brodex.com/api/login",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-469123531&cid=469123531.469123531&en=page_view",204,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=273116774&fmt=gif",204,"image/gif"],["GET","https://api.brodex.com/api/tickets",200,"application/json"],["GET","https://api.brodex.com/favicon.ico",200,"image/x-icon"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.brodex.com/api/tickets?priority=high",200,"application/json"],["GET","https://api.brodex.com/api/tickets/TCK-73769",200,"application/json"],["GET","https://api.brodex.com/api/tickets/TCK-85645",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-725147385&cid=725147385.725147385&en=page_view",204,"text/plain"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.brodex.com/api/tickets",201,"application/json"],["GET","https://api.brodex.com/static/css/main.e9dc2fa9.css",200,"text/css"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.brodex.com/__flags",200,"application/json"],["GET","https://api.brodex.com/api/tickets/TCK-88292",200,"application/json"],["GET","https://api.brodex.com/manifest.json",200,"application/json"],["PATCH","https://api.brodex.com/api/tickets/TCK-88292",200,"application/json"],["DELETE","https://api.brodex.com/api/tickets/TCK-46014",204,"x-unknown"],["POST","https://o245370272.ingest.sentry.io/api/245370272/envelope/?sentry_key=c3b3cdb51f2908527fdcab39",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/2b87a78974955931532d8629/analytics.min.js",200,"application/javascript"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.brodex.com/static/media/logo.7f31e04e.svg",200,"image/svg+xml"],["GET","https://api.brodex.com/config.json",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o23861411.ingest.sentry.io/api/23861411/envelope/?sentry_key=dc11ce316df3ee486c2827a6\",\n \"headers\": {\n \"host\": \"o23861411.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.brodex.com\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.brodex.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"322b02a3c9c66b2c9d880e37\\\"}\"\n }\n }\n}","results":{"c1":[85.7,100.0,100.0,100.0,85.7,100.0,0.0],"c2a":[0.0,100.0,100.0,100.0,0.0,100.0,100.0],"c2b":[100.0,100.0,66.7,85.7,100.0,85.7,85.7]},"fails":{"c1":[5,-1,-1,-1,5,-1,3],"c2a":[3,-1,-1,-1,2,-1,-1],"c2b":[-1,-1,3,5,-1,5,5]}},{"id":"tierb_22_samples","suite":"tier_b","tier":"B","title":"Nimium Samples API","goal":"# Nimium Samples API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.nimium.dev/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:samples","base_path","noise","etag_update","hidden_header"],"n_requests":47,"requests":[["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.nimium.dev/",200,"text/html"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.nimium.dev/static/js/main.8add17ad.js",200,"application/javascript"],["GET","https://api.nimium.dev/static/css/main.c54a45a3.css",200,"text/css"],["GET","https://api.nimium.dev/__flags",200,"application/json"],["GET","https://api.nimium.dev/ping",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.nimium.dev/api/samples",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-344725984&cid=344725984.344725984&en=page_view",204,"text/plain"],["GET","https://api.nimium.dev/api/samples?offset=10",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=702144841&fmt=gif",204,"image/gif"],["GET","https://api.nimium.dev/api/samples?offset=20",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-989682015&cid=989682015.989682015&en=page_view",204,"text/plain"],["GET","https://api.nimium.dev/api/samples?offset=30",200,"application/json"],["GET","https://api.nimium.dev/api/samples?offset=40",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=606710725&fmt=gif",204,"image/gif"],["GET","https://api.nimium.dev/api/samples?lab=summit",200,"application/json"],["GET","https://api.nimium.dev/api/samples?lab=summit&offset=10",200,"application/json"],["GET","https://api.nimium.dev/api/samples?lab=summit&offset=20",200,"application/json"],["GET","https://api.nimium.dev/static/css/main.2ca19173.css",200,"text/css"],["GET","https://api.nimium.dev/__flags",200,"application/json"],["GET","https://api.nimium.dev/api/samples/SMP-75778",200,"application/json"],["GET","https://api.nimium.dev/static/js/main.10b304a2.js",200,"application/javascript"],["GET","https://api.nimium.dev/favicon.ico",200,"image/x-icon"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.nimium.dev/api/samples/SMP-26007",200,"application/json"],["GET","https://api.nimium.dev/__flags",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-994343578.js?sv=6",200,"application/javascript"],["POST","https://api.nimium.dev/api/samples",201,"application/json"],["GET","https://api.nimium.dev/static/media/logo.a2b90de5.svg",200,"image/svg+xml"],["GET","https://api.nimium.dev/api/samples/SMP-74820",200,"application/json"],["PATCH","https://api.nimium.dev/api/samples/SMP-74820",200,"application/json"],["GET","https://api.nimium.dev/static/css/main.304ce5a2.css",200,"text/css"],["GET","https://fonts.gstatic.com/s/inter/v13/bd28ae39fdc819e86de303cd.woff2",200,"font/woff2"],["DELETE","https://api.nimium.dev/api/samples/SMP-88799",204,"x-unknown"],["GET","https://api.nimium.dev/static/css/main.75133c9e.css",200,"text/css"],["GET","https://api.nimium.dev/ping",200,"application/json"],["GET","https://api.nimium.dev/manifest.json",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=61164779&fmt=gif",204,"image/gif"],["GET","https://api.nimium.dev/",200,"text/html"],["GET","https://api.nimium.dev/static/media/logo.bc890090.svg",200,"image/svg+xml"],["GET","https://px.ads.linkedin.com/collect?pid=616859571&fmt=gif",204,"image/gif"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.nimium.dev/__flags\",\n \"headers\": {\n \"host\": \"api.nimium.dev\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.nimium.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.nimium.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"282f53e5\\\"}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,100.0,100.0,100.0],"c2a":[100.0,0.0,100.0,85.7,85.7,100.0,100.0],"c2b":[100.0,100.0,100.0,100.0,85.7,100.0,100.0]},"fails":{"c2a":[-1,3,-1,5,5,-1,-1],"c2b":[-1,-1,-1,-1,5,-1,-1]}},{"id":"tierb_23_shipments","suite":"tier_b","tier":"B","title":"Lumlo Shipments API","goal":"# Lumlo Shipments API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.lumlo.co/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:shipments","base_path","noise","etag_update","envelope","login_format:form","csrf_in:json"],"n_requests":30,"requests":[["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.lumlo.co/static/js/main.bb608984.js",200,"application/javascript"],["POST","https://api.lumlo.co/v1/auth/token",200,"application/json"],["GET","https://api.lumlo.co/v1/items",200,"application/json"],["GET","https://api.lumlo.co/manifest.json",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.lumlo.co/v1/items?status=delivered",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-249301188.js?sv=6",200,"application/javascript"],["GET","https://api.lumlo.co/manifest.json",200,"application/json"],["GET","https://api.lumlo.co/static/media/logo.428d4018.svg",200,"image/svg+xml"],["GET","https://api.lumlo.co/__flags",200,"application/json"],["GET","https://api.lumlo.co/v1/items/SHP-25963",200,"application/json"],["GET","https://api.lumlo.co/",200,"text/html"],["GET","https://www.googletagmanager.com/gtag/js?id=G-668673447",200,"application/javascript"],["GET","https://api.lumlo.co/v1/items/SHP-77819",200,"application/json"],["GET","https://api.lumlo.co/manifest.json",200,"application/json"],["GET","https://api.lumlo.co/config.json",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-658813162",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.lumlo.co/v1/items",201,"application/json"],["GET","https://api.lumlo.co/v1/items/SHP-94145",200,"application/json"],["PATCH","https://api.lumlo.co/v1/items/SHP-94145",200,"application/json"],["GET","https://api.lumlo.co/static/css/main.609b8279.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.lumlo.co/sockjs-node/info",200,"application/json"],["DELETE","https://api.lumlo.co/v1/items/SHP-67455",204,"x-unknown"],["GET","https://www.googletagmanager.com/gtag/js?id=G-107901144",200,"application/javascript"],["GET","https://api.lumlo.co/robots.txt",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.lumlo.co/v1/auth/token\",\n \"headers\": {\n \"host\": \"api.lumlo.co\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.lumlo.co\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.lumlo.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_570ac9ec\\\",\\\"csrf_token\\\":\\\"09ae0d9f02843e64\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c1":[85.7,100.0,100.0,85.7,100.0,100.0,85.7],"c2a":[100.0,100.0,100.0,100.0,85.7,100.0,85.7],"c2b":[0.0,100.0,100.0,85.7,100.0,100.0,85.7]},"fails":{"c1":[5,-1,-1,5,-1,-1,5],"c2a":[-1,-1,-1,-1,2,-1,5],"c2b":[0,-1,-1,5,-1,-1,5]}},{"id":"tierb_24_tickets","suite":"tier_b","tier":"B","title":"Torna Tickets API","goal":"# Torna Tickets API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.torna.com/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:tickets","base_path","noise","token_expiry","login_format:form"],"n_requests":57,"requests":[["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.torna.com/static/media/logo.19197061.svg",200,"image/svg+xml"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-309225284&cid=309225284.309225284&en=page_view",204,"text/plain"],["GET","https://api.torna.com/sockjs-node/info",200,"application/json"],["GET","https://api.torna.com/favicon.ico",200,"image/x-icon"],["POST","https://api.torna.com/v3/login",200,"application/json"],["GET","https://api.torna.com/v3/items",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.torna.com/v3/items?p=2",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.torna.com/v3/items?p=3",200,"application/json"],["GET","https://api.torna.com/v3/items?p=4",200,"application/json"],["GET","https://api.torna.com/v3/items?p=5",401,"application/json"],["POST","https://api.torna.com/v3/login",200,"application/json"],["GET","https://api.torna.com/static/media/logo.2dc292a8.svg",200,"image/svg+xml"],["GET","https://api.torna.com/static/media/logo.10089be5.svg",200,"image/svg+xml"],["GET","https://api.torna.com/v3/items?p=5",200,"application/json"],["GET","https://api.torna.com/config.json",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-315673603&cid=315673603.315673603&en=page_view",204,"text/plain"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.torna.com/ping",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=852539489&fmt=gif",204,"image/gif"],["POST","https://o413912970.ingest.sentry.io/api/413912970/envelope/?sentry_key=2679fe9e5ea7b1dac5b0f07f",200,"application/json"],["POST","https://o976154437.ingest.sentry.io/api/976154437/envelope/?sentry_key=fccfdc97029fd3487b23c1d7",200,"application/json"],["GET","https://api.torna.com/v3/items?priority=high",200,"application/json"],["GET","https://api.torna.com/v3/items?priority=high&p=2",200,"application/json"],["GET","https://api.torna.com/v3/items/TCK-87382",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=579190100&fmt=gif",204,"image/gif"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://o426760569.ingest.sentry.io/api/426760569/envelope/?sentry_key=67ee7f03a3f414c730b05bde",200,"application/json"],["GET","https://api.torna.com/__flags",200,"application/json"],["GET","https://api.torna.com/v3/items/TCK-52280",401,"application/json"],["POST","https://api.torna.com/v3/login",200,"application/json"],["GET","https://api.torna.com/v3/items/TCK-52280",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/140ab499cc612a2364b6dd1e.woff2",200,"font/woff2"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=993021536&fmt=gif",204,"image/gif"],["GET","https://api.torna.com/static/css/main.d8983cb2.css",200,"text/css"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/4b16231cd82a5874526483a1.woff2",200,"font/woff2"],["POST","https://api.torna.com/v3/items",201,"application/json"],["PATCH","https://api.torna.com/v3/items/TCK-36302",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://o648119347.ingest.sentry.io/api/648119347/envelope/?sentry_key=6bef0169061b547bc8fc9759",200,"application/json"],["DELETE","https://api.torna.com/v3/items/TCK-11404",204,"x-unknown"],["GET","https://api.torna.com/config.json",200,"application/json"],["POST","https://o312397568.ingest.sentry.io/api/312397568/envelope/?sentry_key=2d77e8af878a9bd76e14ef30",200,"application/json"],["GET","https://api.torna.com/static/js/main.23f2454c.js",200,"application/javascript"],["GET","https://api.torna.com/config.json",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.torna.com/robots.txt",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.torna.com\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.torna.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,0.0,0.0,100.0,0.0],"c2a":[100.0,100.0,0.0,100.0,100.0,100.0,0.0],"c2b":[0.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c1":[-1,-1,-1,0,0,-1,4],"c2a":[-1,-1,3,-1,-1,-1,0],"c2b":[3,-1,-1,-1,-1,-1,-1]}},{"id":"tierb_25_tickets","suite":"tier_b","tier":"B","title":"Fenora Tickets API","goal":"# Fenora Tickets API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.fenora.app/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:tickets","base_path","noise","token_expiry","etag_update","hidden_header","login_format:json","csrf_in:header"],"n_requests":37,"requests":[["GET","https://cdn.segment.com/analytics.js/v1/cc7f49737e395d6a15c0bf3e/analytics.min.js",200,"application/javascript"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.fenora.app/config.json",200,"application/json"],["POST","https://api.fenora.app/v2/auth/token",200,"application/json"],["GET","https://api.fenora.app/v2/items",200,"application/json"],["POST","https://o988843686.ingest.sentry.io/api/988843686/envelope/?sentry_key=335ef1ddba7cb9e1544d7307",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=840290850&fmt=gif",204,"image/gif"],["GET","https://api.fenora.app/v2/items?priority=high",200,"application/json"],["GET","https://api.fenora.app/",200,"text/html"],["GET","https://api.fenora.app/v2/items/TCK-62930",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-985522567&cid=985522567.985522567&en=page_view",204,"text/plain"],["GET","https://api.fenora.app/config.json",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-147255359",200,"application/javascript"],["POST","https://o218127519.ingest.sentry.io/api/218127519/envelope/?sentry_key=62725a0bd2d23b6254b51372",200,"application/json"],["GET","https://api.fenora.app/v2/items/TCK-81232",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/f2d0b4fb9389fce76a072c95/analytics.min.js",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/ce1b002f5ff995615a9f95e8/analytics.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-483390578&cid=483390578.483390578&en=page_view",204,"text/plain"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://o378000500.ingest.sentry.io/api/378000500/envelope/?sentry_key=0a566cdf4f1d9b7fc454de16",200,"application/json"],["GET","https://api.fenora.app/",200,"text/html"],["POST","https://api.fenora.app/v2/items",401,"application/json"],["POST","https://api.fenora.app/v2/auth/token",200,"application/json"],["POST","https://api.fenora.app/v2/items",201,"application/json"],["GET","https://api.fenora.app/sockjs-node/info",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.fenora.app/v2/items/TCK-48653",200,"application/json"],["PATCH","https://api.fenora.app/v2/items/TCK-48653",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://cdn.segment.com/analytics.js/v1/6d6ec57038f428fcdbae25c9/analytics.min.js",200,"application/javascript"],["GET","https://api.fenora.app/static/css/main.06aba28d.css",200,"text/css"],["DELETE","https://api.fenora.app/v2/items/TCK-20359",204,"x-unknown"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.fenora.app/config.json",200,"application/json"],["GET","https://api.fenora.app/favicon.ico",200,"image/x-icon"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.fenora.app/config.json\",\n \"headers\": {\n \"host\": \"api.fenora.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.fenora.app\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.fenora.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"35d73df0\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}","results":{"c1":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2a":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2b":[85.7,100.0,95.2,0.0,0.0,85.7,57.1]},"fails":{"c1":[3,1,1,3,3,1,3],"c2a":[3,3,1,3,2,3,3],"c2b":[5,-1,5,3,3,5,4]}},{"id":"tierb_26_shipments","suite":"tier_b","tier":"B","title":"Pello Shipments API","goal":"# Pello Shipments API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pello.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:shipments","base_path","noise","etag_update","login_format:json","csrf_in:header"],"n_requests":43,"requests":[["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.pello.dev/",200,"text/html"],["POST","https://o847375398.ingest.sentry.io/api/847375398/envelope/?sentry_key=c4f1c27f6d5a6ae84b9aa230",200,"application/json"],["GET","https://api.pello.dev/static/css/main.3832e3b4.css",200,"text/css"],["POST","https://api.pello.dev/v2/sessions",200,"application/json"],["GET","https://api.pello.dev/v2/records",200,"application/json"],["GET","https://api.pello.dev/static/js/main.a5090ac3.js",200,"application/javascript"],["GET","https://api.pello.dev/ping",200,"application/json"],["GET","https://api.pello.dev/v2/records?offset=10",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-231710349",200,"application/javascript"],["GET","https://api.pello.dev/v2/records?offset=20",200,"application/json"],["GET","https://api.pello.dev/v2/records?offset=30",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=783685257&fmt=gif",204,"image/gif"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-658768468&cid=658768468.658768468&en=page_view",204,"text/plain"],["GET","https://api.pello.dev/v2/records?status=pending",200,"application/json"],["GET","https://api.pello.dev/config.json",200,"application/json"],["GET","https://api.pello.dev/v2/records?status=pending&offset=10",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://www.googletagmanager.com/gtag/js?id=G-903861653",200,"application/javascript"],["GET","https://api.pello.dev/v2/records/SHP-18893",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=346894287&fmt=gif",204,"image/gif"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.pello.dev/v2/records/SHP-48831",200,"application/json"],["GET","https://api.pello.dev/config.json",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-761099398&cid=761099398.761099398&en=page_view",204,"text/plain"],["POST","https://api.pello.dev/v2/records",201,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://www.googletagmanager.com/gtag/js?id=G-962023428",200,"application/javascript"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.pello.dev/v2/records/SHP-57663",200,"application/json"],["PATCH","https://api.pello.dev/v2/records/SHP-57663",200,"application/json"],["POST","https://o34406352.ingest.sentry.io/api/34406352/envelope/?sentry_key=59b5cf894570e83bdd5702bd",200,"application/json"],["GET","https://api.pello.dev/__flags",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["DELETE","https://api.pello.dev/v2/records/SHP-30663",204,"x-unknown"],["GET","https://fonts.gstatic.com/s/inter/v13/3f4a7017ae4bd59f2c1e7cbd.woff2",200,"font/woff2"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.pello.dev/",200,"text/html"],["GET","https://px.ads.linkedin.com/collect?pid=27797689&fmt=gif",204,"image/gif"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.pello.dev\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pello.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,100.0,100.0,85.7],"c2a":[100.0,100.0,100.0,0.0,0.0,100.0,100.0],"c2b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c1":[-1,-1,-1,-1,-1,-1,5],"c2a":[-1,-1,-1,2,3,-1,-1]}},{"id":"tierb_27_shipments","suite":"tier_b","tier":"B","title":"Havant Shipments API","goal":"# Havant Shipments API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havant.com/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:cursor","domain:shipments","base_path","noise","etag_update"],"n_requests":40,"requests":[["GET","https://static.hotjar.com/c/hotjar-406254797.js?sv=6",200,"application/javascript"],["GET","https://api.havant.com/",200,"text/html"],["GET","https://api.havant.com/robots.txt",200,"text/plain"],["GET","https://api.havant.com/v3/shipments",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.havant.com/v3/shipments?page_token=NGZkMGEyOTg6MTA",200,"application/json"],["GET","https://api.havant.com/v3/shipments?page_token=NGZkMGEyOTg6MjA",200,"application/json"],["GET","https://api.havant.com/v3/shipments?page_token=NGZkMGEyOTg6MzA",200,"application/json"],["GET","https://api.havant.com/ping",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-925009640&cid=925009640.925009640&en=page_view",204,"text/plain"],["GET","https://api.havant.com/manifest.json",200,"application/json"],["GET","https://api.havant.com/v3/shipments?status=in_transit",200,"application/json"],["GET","https://api.havant.com/v3/shipments?status=in_transit&page_token=NGZkMGEyOTg6MTA",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.havant.com/robots.txt",200,"text/plain"],["GET","https://api.havant.com/v3/shipments/SHP-42664",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-923819779&cid=923819779.923819779&en=page_view",204,"text/plain"],["GET","https://api.havant.com/v3/shipments/SHP-20233",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=559377459&fmt=gif",204,"image/gif"],["GET","https://api.havant.com/",200,"text/html"],["GET","https://api.havant.com/config.json",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/bbe1a9f71c1bc585348bb12d.woff2",200,"font/woff2"],["POST","https://api.havant.com/v3/shipments",201,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.havant.com/robots.txt",200,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-227088724&cid=227088724.227088724&en=page_view",204,"text/plain"],["GET","https://api.havant.com/v3/shipments/SHP-70891",200,"application/json"],["PATCH","https://api.havant.com/v3/shipments/SHP-70891",200,"application/json"],["GET","https://api.havant.com/manifest.json",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/e38ad23ba93193dc4cc6eb96/analytics.min.js",200,"application/javascript"],["DELETE","https://api.havant.com/v3/shipments/SHP-52407",204,"x-unknown"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.havant.com/__flags",200,"application/json"],["GET","https://api.havant.com/ping",200,"application/json"],["GET","https://api.havant.com/",200,"text/html"],["GET","https://px.ads.linkedin.com/collect?pid=106809178&fmt=gif",204,"image/gif"],["GET","https://api.havant.com/static/css/main.555335e6.css",200,"text/css"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.havant.com/v3/shipments\",\n \"headers\": {\n \"host\": \"api.havant.com\",\n \"connection\": \"keep-alive\",\n \"x-api-token\": \"sk_f90588f4760d377091b06636\",\n \"origin\": \"https://app.havant.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havant.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"items\\\":[{\\\"id\\\":\\\"SHP-66398\\\",\\\"created_at\\\":\\\"2026-01-05T19:00:00Z\\\",\\\"carrier\\\":\\\"Orbitrail\\\",\\\"status\\\":\\\"in_transit\\\",\\\"origin\\\":\\\"Perth\\\",\\\"destination\\\":\\\"Osaka\\\",\\\"weight_kg\\\":479.5,\\\"fragile\\\":false,\\\"eta_days\\\":20},{\\\"id\\\":\\\"SHP-29069\\\",\\\"created_at\\\":\\\"2026-01-05T21:17:00Z\\\",\\\"carrier\\\":\\\"Tidewater Express\\\",\\\"status\\\":\\\"in_transit\\\",\\\"origin\\\":\\\"Tallinn\\\",\\\"destination\\\":\\\"Ghent\\\",\\\"weight_kg\\\":441.9,\\\"fragile\\\":false,\\\"eta_days\\\":9},{\\\"id\\\":\\\"SHP-31368\\\",\\\"created_at\\\":\\\"2026-01-05T22:35:00Z\\\",\\\"carrier\\\":\\\"Orbitrail\\\",\\\"status\\\":\\\"delivered\\\",\\\"origin\\\":\\\"Reykjavik\\\",\\\"destination\\\":\\\"Perth\\\",\\\"weight_kg\\\":261.9,\\\"fragile\\\":false,\\\"eta_days\\\":7},{\\\"id\\\":\\\"SHP-78010\\\",\\\"created_at\\\":\\\"2026-01-05T23:29:00Z\\\",\\\"carrier\\\":\\\"Northwind Freight\\\",\\\"status\\\":\\\"in_transit\\\",\\\"origin\\","results":{"c1":[100.0,100.0,100.0,100.0,100.0,100.0,85.7],"c2a":[100.0,100.0,0.0,100.0,100.0,100.0,85.7],"c2b":[100.0,100.0,100.0,85.7,100.0,100.0,85.7]},"fails":{"c1":[-1,-1,-1,-1,-1,-1,5],"c2a":[-1,-1,3,-1,-1,-1,5],"c2b":[-1,-1,-1,5,-1,-1,5]}},{"id":"tierb_28_tickets","suite":"tier_b","tier":"B","title":"Quoik Tickets API","goal":"# Quoik Tickets API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quoik.app/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:link_header","domain:tickets","base_path","noise","etag_update","hidden_header"],"n_requests":37,"requests":[["GET","https://api.quoik.app/v1/records",200,"application/json"],["GET","https://api.quoik.app/favicon.ico",200,"image/x-icon"],["GET","https://api.quoik.app/v1/records?p=2",200,"application/json"],["GET","https://api.quoik.app/v1/records?p=3",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-762906453",200,"application/javascript"],["GET","https://api.quoik.app/__flags",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.quoik.app/favicon.ico",200,"image/x-icon"],["GET","https://api.quoik.app/v1/records?priority=urgent",200,"application/json"],["GET","https://api.quoik.app/favicon.ico",200,"image/x-icon"],["GET","https://api.quoik.app/v1/records?priority=urgent&p=2",200,"application/json"],["GET","https://api.quoik.app/static/js/main.230717d3.js",200,"application/javascript"],["GET","https://api.quoik.app/__flags",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-308948987&cid=308948987.308948987&en=page_view",204,"text/plain"],["GET","https://api.quoik.app/v1/records/TCK-36264",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.quoik.app/v1/records/TCK-30127",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/36652821c990908d9cdb5c83/analytics.min.js",200,"application/javascript"],["GET","https://api.quoik.app/config.json",200,"application/json"],["GET","https://api.quoik.app/static/css/main.c91b36db.css",200,"text/css"],["GET","https://api.quoik.app/__flags",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/c7b28f7678b46d6741d061bb/analytics.min.js",200,"application/javascript"],["POST","https://api.quoik.app/v1/records",201,"application/json"],["POST","https://o506748293.ingest.sentry.io/api/506748293/envelope/?sentry_key=513ebb318e2b9bb86b993d35",200,"application/json"],["GET","https://api.quoik.app/",200,"text/html"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.quoik.app/v1/records/TCK-97118",200,"application/json"],["PATCH","https://api.quoik.app/v1/records/TCK-97118",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://o461693985.ingest.sentry.io/api/461693985/envelope/?sentry_key=325242ef0b31d362087397fb",200,"application/json"],["DELETE","https://api.quoik.app/v1/records/TCK-34351",204,"x-unknown"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-185994822&cid=185994822.185994822&en=page_view",204,"text/plain"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.quoik.app/static/css/main.25dfc38c.css",200,"text/css"],["GET","https://static.hotjar.com/c/hotjar-751307210.js?sv=6",200,"application/javascript"],["GET","https://static.hotjar.com/c/hotjar-358296074.js?sv=6",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=309640296&fmt=gif",204,"image/gif"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.quoik.app/v1/records\",\n \"headers\": {\n \"host\": \"api.quoik.app\",\n \"connection\": \"keep-alive\",\n \"x-client-version\": \"4.11.1\",\n \"x-api-key\": \"sk_486f3827c608ce4f8704b985\",\n \"origin\": \"https://app.quoik.app\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.quoik.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"[{\\\"id\\\":\\\"TCK-44511\\\",\\\"created_at\\\":\\\"2026-01-05T18:04:00Z\\\",\\\"title\\\":\\\"Role change not applied\\\",\\\"priority\\\":\\\"urgent\\\",\\\"assignee\\\":\\\"Dev Patel\\\",\\\"queue\\\":\\\"security\\\",\\\"estimate_hours\\\":19,\\\"customer_visible\\\":false},{\\\"id\\\":\\\"TCK-59179\\\",\\\"created_at\\\":\\\"2026-01-05T19:02:00Z\\\",\\\"title\\\":\\\"Role change not applied\\\",\\\"priority\\\":\\\"normal\\\",\\\"assignee\\\":\\\"Marta Lindqvist\\\",\\\"queue\\\":\\\"platform\\\",\\\"estimate_hours\\\":34,\\\"customer_visible\\\":false},{\\\"id\\\":\\\"TCK-39329\\\",\\\"created_at\\\":\\\"2026-01-05T20:07:00Z\\\",\\\"title\\\":\\\"Role change not applied\\\",\\\"priority\\\":\\\"normal\\\",\\\"assignee\\\":\\\"Amara Okoye\\\",\\\"queue\\\":\\\"billing\\\",\\\"estimate_hours\\\":15,\\\"customer_visible\\\":true},{\\\"id\\\":\\\"TCK-55517\\\",\\\"created_at\\\":\\\"2026-01-05T21:06:00Z\\\",\\\"title\\\":\\\"Invoice PDF misses th","results":{"c1":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2a":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2b":[0.0,100.0,100.0,0.0,0.0,0.0,85.7]},"fails":{"c1":[1,1,1,1,1,1,1],"c2a":[1,1,3,1,1,1,1],"c2b":[0,-1,-1,1,1,1,5]}},{"id":"tierb_29_samples","suite":"tier_b","tier":"B","title":"Lumium Samples API","goal":"# Lumium Samples API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.lumium.com/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:link_header","domain:samples","base_path","noise","token_expiry","etag_update","hidden_header","envelope","login_format:form","csrf_in:json"],"n_requests":67,"requests":[["GET","https://www.googletagmanager.com/gtag/js?id=G-690969718",200,"application/javascript"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://api.lumium.com/api/login",200,"application/json"],["GET","https://api.lumium.com/api/records",200,"application/json"],["GET","https://api.lumium.com/api/records?p=2",200,"application/json"],["GET","https://api.lumium.com/api/records?p=3",200,"application/json"],["GET","https://api.lumium.com/static/css/main.62cf7995.css",200,"text/css"],["GET","https://api.lumium.com/api/records?p=4",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=302362240&fmt=gif",204,"image/gif"],["GET","https://api.lumium.com/ping",200,"application/json"],["GET","https://api.lumium.com/config.json",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=322283039&fmt=gif",204,"image/gif"],["GET","https://api.lumium.com/api/records?lab=delta",401,"application/json"],["GET","https://api.lumium.com/sockjs-node/info",200,"application/json"],["POST","https://api.lumium.com/api/login",200,"application/json"],["GET","https://api.lumium.com/",200,"text/html"],["GET","https://api.lumium.com/static/css/main.ad527d5f.css",200,"text/css"],["GET","https://api.lumium.com/api/records?lab=delta",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.lumium.com/api/records?lab=delta&p=2",200,"application/json"],["GET","https://api.lumium.com/api/records?lab=delta&p=3",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://o804188147.ingest.sentry.io/api/804188147/envelope/?sentry_key=f8eefd02b1818aaad1ff7428",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/1738e50367acedb4bb5541f5/analytics.min.js",200,"application/javascript"],["GET","https://api.lumium.com/robots.txt",200,"text/plain"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.lumium.com/static/js/main.ca1fef00.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=813413806&fmt=gif",204,"image/gif"],["GET","https://api.lumium.com/api/records/SMP-13164",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.lumium.com/robots.txt",200,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.lumium.com/api/records/SMP-47512",401,"application/json"],["POST","https://api.lumium.com/api/login",200,"application/json"],["GET","https://api.lumium.com/",200,"text/html"],["GET","https://api.lumium.com/api/records/SMP-47512",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=791816429&fmt=gif",204,"image/gif"],["GET","https://api.lumium.com/__flags",200,"application/json"],["GET","https://api.lumium.com/static/css/main.cb4f1cbf.css",200,"text/css"],["POST","https://api.lumium.com/api/records",201,"application/json"],["GET","https://api.lumium.com/ping",200,"application/json"],["GET","https://api.lumium.com/",200,"text/html"],["GET","https://api.lumium.com/api/records/SMP-29089",200,"application/json"],["PATCH","https://api.lumium.com/api/records/SMP-29089",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.lumium.com/__flags",200,"application/json"],["POST","https://o423029511.ingest.sentry.io/api/423029511/envelope/?sentry_key=97d8a02cc9827f670849aa9c",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-526295121",200,"application/javascript"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/5d32d0a2c6a607f4016df452/analytics.min.js",200,"application/javascript"],["GET","https://api.lumium.com/static/media/logo.9be72cc7.svg",200,"image/svg+xml"],["DELETE","https://api.lumium.com/api/records/SMP-35981",401,"application/json"],["GET","https://api.lumium.com/manifest.json",200,"application/json"],["GET","https://api.lumium.com/static/js/main.8a06fef6.js",200,"application/javascript"],["POST","https://api.lumium.com/api/login",200,"application/json"],["DELETE","https://api.lumium.com/api/records/SMP-35981",204,"x-unknown"],["GET","https://api.lumium.com/ping",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.lumium.com/api/login\",\n \"headers\": {\n \"host\": \"api.lumium.com\",\n \"connection\": \"keep-alive\",\n \"x-app-build\": \"1773\",\n \"origin\": \"https://app.lumium.com\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.lumium.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"user\\\":\\\"user_b137ca69\\\",\\\"csrf_token\\\":\\\"c0815db78fc1b8d7\\\"},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c1":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2a":[0.0,0.0,0.0,0.0,0.0,100.0,0.0],"c2b":[0.0,100.0,100.0,0.0,0.0,0.0,0.0]},"fails":{"c1":[1,3,1,3,1,3,3],"c2a":[3,1,7,3,1,-1,3],"c2b":[3,-1,-1,3,3,3,3]}},{"id":"tierb_30_samples","suite":"tier_b","tier":"B","title":"Pelrix Samples API","goal":"# Pelrix Samples API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.pelrix.app/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:none","domain:samples","base_path","noise"],"n_requests":23,"requests":[["GET","https://api.pelrix.app/",200,"text/html"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.pelrix.app/api/samples",200,"application/json"],["GET","https://api.pelrix.app/api/samples?lab=summit",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.pelrix.app/api/samples/SMP-53369",200,"application/json"],["GET","https://api.pelrix.app/ping",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.pelrix.app/manifest.json",200,"application/json"],["GET","https://api.pelrix.app/api/samples/SMP-79761",200,"application/json"],["GET","https://api.pelrix.app/",200,"text/html"],["GET","https://api.pelrix.app/manifest.json",200,"application/json"],["GET","https://api.pelrix.app/static/media/logo.0dd9ed62.svg",200,"image/svg+xml"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.pelrix.app/favicon.ico",200,"image/x-icon"],["POST","https://api.pelrix.app/api/samples",201,"application/json"],["PATCH","https://api.pelrix.app/api/samples/SMP-93894",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.pelrix.app/manifest.json",200,"application/json"],["DELETE","https://api.pelrix.app/api/samples/SMP-17904",204,"x-unknown"],["GET","https://api.pelrix.app/__flags",200,"application/json"],["GET","https://api.pelrix.app/robots.txt",200,"text/plain"],["GET","https://static.hotjar.com/c/hotjar-149766375.js?sv=6",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.pelrix.app/api/samples\",\n \"headers\": {\n \"host\": \"api.pelrix.app\",\n \"connection\": \"keep-alive\",\n \"api-key\": \"sk_94c80896b4ddb05ecb58a2f3\",\n \"origin\": \"https://app.pelrix.app\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.pelrix.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"[{\\\"id\\\":\\\"SMP-27044\\\",\\\"created_at\\\":\\\"2026-01-05T12:21:00Z\\\",\\\"assay\\\":\\\"pcr\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":322.0,\\\"collected_on\\\":\\\"2026-06-04\\\",\\\"batch\\\":\\\"B-4969\\\",\\\"hazardous\\\":false},{\\\"id\\\":\\\"SMP-20140\\\",\\\"created_at\\\":\\\"2026-01-05T14:37:00Z\\\",\\\"assay\\\":\\\"mass_spec\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":883.6,\\\"collected_on\\\":\\\"2026-01-14\\\",\\\"batch\\\":\\\"B-2015\\\",\\\"hazardous\\\":false},{\\\"id\\\":\\\"SMP-42054\\\",\\\"created_at\\\":\\\"2026-01-05T14:50:00Z\\\",\\\"assay\\\":\\\"pcr\\\",\\\"lab\\\":\\\"delta\\\",\\\"volume_ul\\\":886.4,\\\"collected_on\\\":\\\"2026-06-21\\\",\\\"batch\\\":\\\"B-4108\\\",\\\"hazardous\\\":false},{\\\"id\\\":\\\"SMP-60099\\\",\\\"created_at\\\":\\\"2026-01-05T17:04:00Z\\\",\\\"assay\\\":\\\"elisa\\\",\\\"lab\\\":\\\"harbor\\\",\\\"volume_ul\\\":670.6,\\\"collected_on\\\":\\\"2026-08-02\\\",\\\"batch\\\":\\\"B-3585\\\",\\\"hazardous\\\":false},{\\\"id\\\":\\\"SMP-27527\\\",\\\"creat","results":{"c1":[100.0,100.0,100.0,100.0,100.0,100.0,100.0],"c2a":[100.0,0.0,0.0,100.0,71.4,100.0,100.0],"c2b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c2a":[-1,3,3,-1,6,-1,-1]}},{"id":"tierb_31_invoices","suite":"tier_b","tier":"B","title":"Oriik Invoices API","goal":"# Oriik Invoices API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.oriik.net/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:invoices","base_path","noise","etag_update","hidden_header"],"n_requests":37,"requests":[["GET","https://fonts.gstatic.com/s/inter/v13/17bfc94d83dce77fdafc72e7.woff2",200,"font/woff2"],["GET","https://static.hotjar.com/c/hotjar-274785463.js?sv=6",200,"application/javascript"],["POST","https://o556976118.ingest.sentry.io/api/556976118/envelope/?sentry_key=886ef5af8c314f8487a99422",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.oriik.net/v2/invoices",200,"application/json"],["GET","https://api.oriik.net/v2/invoices?skip=10",200,"application/json"],["GET","https://api.oriik.net/v2/invoices?skip=20",200,"application/json"],["GET","https://api.oriik.net/static/media/logo.62b311bc.svg",200,"image/svg+xml"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-594740975",200,"application/javascript"],["GET","https://api.oriik.net/v2/invoices?state=paid",200,"application/json"],["GET","https://api.oriik.net/v2/invoices?state=paid&skip=10",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-453532461",200,"application/javascript"],["GET","https://api.oriik.net/ping",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.oriik.net/config.json",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.oriik.net/v2/invoices/INV-18901",200,"application/json"],["POST","https://o86340444.ingest.sentry.io/api/86340444/envelope/?sentry_key=9022308213967282f517b391",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/be326d25bd6976f60bb7bcff/analytics.min.js",200,"application/javascript"],["GET","https://api.oriik.net/config.json",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.oriik.net/v2/invoices/INV-74854",200,"application/json"],["GET","https://api.oriik.net/static/media/logo.4383f1ed.svg",200,"image/svg+xml"],["POST","https://api.oriik.net/v2/invoices",201,"application/json"],["GET","https://api.oriik.net/v2/invoices/INV-51425",200,"application/json"],["PATCH","https://api.oriik.net/v2/invoices/INV-51425",200,"application/json"],["GET","https://api.oriik.net/static/css/main.c140b1d9.css",200,"text/css"],["GET","https://api.oriik.net/config.json",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["DELETE","https://api.oriik.net/v2/invoices/INV-91170",204,"x-unknown"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.oriik.net/manifest.json",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-330288351&cid=330288351.330288351&en=page_view",204,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o556976118.ingest.sentry.io/api/556976118/envelope/?sentry_key=886ef5af8c314f8487a99422\",\n \"headers\": {\n \"host\": \"o556976118.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.oriik.net\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.oriik.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"11ad6207ea3e1eaf0fafdaad\\\"}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,85.7,100.0,100.0],"c2a":[100.0,100.0,100.0,85.7,85.7,100.0,100.0],"c2b":[100.0,100.0,100.0,85.7,85.7,100.0,85.7]},"fails":{"c1":[-1,-1,-1,-1,5,-1,-1],"c2a":[-1,-1,-1,5,5,-1,-1],"c2b":[-1,-1,-1,5,5,-1,5]}},{"id":"tierb_32_shipments","suite":"tier_b","tier":"B","title":"Mirra Shipments API","goal":"# Mirra Shipments API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.mirra.com/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:cursor","domain:shipments","base_path","noise","token_expiry","etag_update","hidden_header","envelope","login_format:json"],"n_requests":53,"requests":[["GET","https://www.googletagmanager.com/gtag/js?id=G-135843933",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://fonts.gstatic.com/s/inter/v13/d53bb071bb4a9f3c2fdf7a25.woff2",200,"font/woff2"],["GET","https://api.mirra.com/static/css/main.ace16a5c.css",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=589797406&fmt=gif",204,"image/gif"],["POST","https://api.mirra.com/v2/login",200,"application/json"],["GET","https://api.mirra.com/v2/records",200,"application/json"],["GET","https://api.mirra.com/v2/records?page_token=YjZiOWY0ZTM6MTA",200,"application/json"],["GET","https://api.mirra.com/v2/records?page_token=YjZiOWY0ZTM6MjA",200,"application/json"],["GET","https://api.mirra.com/__flags",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/4fd08d3850e3c8406ac08712/analytics.min.js",200,"application/javascript"],["GET","https://api.mirra.com/__flags",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=934688549&fmt=gif",204,"image/gif"],["GET","https://api.mirra.com/v2/records?status=pending",200,"application/json"],["GET","https://api.mirra.com/static/css/main.915e0a2c.css",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=572864280&fmt=gif",204,"image/gif"],["GET","https://api.mirra.com/v2/records?status=pending&page_token=YjZiOWY0ZTM6MTA",401,"application/json"],["POST","https://api.mirra.com/v2/login",200,"application/json"],["GET","https://api.mirra.com/v2/records?status=pending&page_token=YjZiOWY0ZTM6MTA",200,"application/json"],["GET","https://api.mirra.com/__flags",200,"application/json"],["GET","https://api.mirra.com/robots.txt",200,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=447003894&fmt=gif",204,"image/gif"],["GET","https://api.mirra.com/ping",200,"application/json"],["GET","https://api.mirra.com/v2/records/SHP-40227",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.mirra.com/v2/records/SHP-63793",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://static.hotjar.com/c/hotjar-768888518.js?sv=6",200,"application/javascript"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://api.mirra.com/v2/records",201,"application/json"],["GET","https://api.mirra.com/__flags",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=737424071&fmt=gif",204,"image/gif"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.mirra.com/v2/records/SHP-75995",401,"application/json"],["POST","https://api.mirra.com/v2/login",200,"application/json"],["GET","https://api.mirra.com/v2/records/SHP-75995",200,"application/json"],["GET","https://api.mirra.com/manifest.json",200,"application/json"],["PATCH","https://api.mirra.com/v2/records/SHP-75995",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://static.hotjar.com/c/hotjar-565933757.js?sv=6",200,"application/javascript"],["GET","https://api.mirra.com/static/css/main.6e5e0605.css",200,"text/css"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.mirra.com/",200,"text/html"],["DELETE","https://api.mirra.com/v2/records/SHP-20898",204,"x-unknown"],["GET","https://api.mirra.com/",200,"text/html"],["GET","https://api.mirra.com/static/media/logo.6286618a.svg",200,"image/svg+xml"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://fonts.gstatic.com/s/inter/v13/e7e5a6fe8015d1ec037aba40.woff2",200,"font/woff2"],["POST","https://o975528899.ingest.sentry.io/api/975528899/envelope/?sentry_key=62543eab9c9ce337d14ed28f",200,"application/json"],["GET","https://api.mirra.com/config.json",200,"application/json"],["POST","https://o712405413.ingest.sentry.io/api/712405413/envelope/?sentry_key=ae9bc1b2b84e6165c45d76e9",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.mirra.com/v2/login\",\n \"headers\": {\n \"host\": \"api.mirra.com\",\n \"connection\": \"keep-alive\",\n \"x-app-build\": \"5121\",\n \"origin\": \"https://app.mirra.com\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.mirra.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"token\\\":\\\"tok_b706bdebf74c84a0b26382d1\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c1":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2a":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2b":[0.0,100.0,100.0,100.0,100.0,0.0,0.0]},"fails":{"c1":[1,1,1,3,1,3,3],"c2a":[1,1,1,1,1,3,3],"c2b":[3,-1,-1,-1,-1,3,1]}},{"id":"tierb_33_tickets","suite":"tier_b","tier":"B","title":"Daxly Tickets API","goal":"# Daxly Tickets API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.daxly.net/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:tickets","base_path","noise","token_expiry","hidden_header","login_format:json","csrf_in:header"],"n_requests":57,"requests":[["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://fonts.gstatic.com/s/inter/v13/7d91ce527aa584bf3990ebdf.woff2",200,"font/woff2"],["GET","https://api.daxly.net/__flags",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.daxly.net/robots.txt",200,"text/plain"],["POST","https://api.daxly.net/v1/auth/login",200,"application/json"],["GET","https://api.daxly.net/v1/tickets",200,"application/json"],["GET","https://api.daxly.net/static/js/main.5a3ca8f8.js",200,"application/javascript"],["GET","https://api.daxly.net/v1/tickets?page_token=ZWNiMmQxNzI6MTA",200,"application/json"],["GET","https://api.daxly.net/v1/tickets?page_token=ZWNiMmQxNzI6MjA",200,"application/json"],["GET","https://api.daxly.net/v1/tickets?page_token=ZWNiMmQxNzI6MzA",200,"application/json"],["GET","https://api.daxly.net/v1/tickets?page_token=ZWNiMmQxNzI6NDA",401,"application/json"],["POST","https://api.daxly.net/v1/auth/login",200,"application/json"],["GET","https://api.daxly.net/v1/tickets?page_token=ZWNiMmQxNzI6NDA",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-719880480.js?sv=6",200,"application/javascript"],["GET","https://api.daxly.net/sockjs-node/info",200,"application/json"],["GET","https://api.daxly.net/favicon.ico",200,"image/x-icon"],["GET","https://api.daxly.net/config.json",200,"application/json"],["GET","https://api.daxly.net/v1/tickets?priority=normal",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-521548470&cid=521548470.521548470&en=page_view",204,"text/plain"],["GET","https://api.daxly.net/favicon.ico",200,"image/x-icon"],["GET","https://api.daxly.net/v1/tickets?priority=normal&page_token=ZWNiMmQxNzI6MTA",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-113906206.js?sv=6",200,"application/javascript"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.daxly.net/static/css/main.ae5d27ab.css",200,"text/css"],["GET","https://static.hotjar.com/c/hotjar-695322485.js?sv=6",200,"application/javascript"],["GET","https://api.daxly.net/favicon.ico",200,"image/x-icon"],["GET","https://api.daxly.net/v1/tickets/TCK-66126",200,"application/json"],["GET","https://api.daxly.net/",200,"text/html"],["GET","https://px.ads.linkedin.com/collect?pid=216476067&fmt=gif",204,"image/gif"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.daxly.net/v1/tickets/TCK-13554",401,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://api.daxly.net/v1/auth/login",200,"application/json"],["GET","https://api.daxly.net/v1/tickets/TCK-13554",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-446168372",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-812529780&cid=812529780.812529780&en=page_view",204,"text/plain"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.daxly.net/__flags",200,"application/json"],["POST","https://api.daxly.net/v1/tickets",201,"application/json"],["GET","https://api.daxly.net/config.json",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["PATCH","https://api.daxly.net/v1/tickets/TCK-96593",200,"application/json"],["GET","https://api.daxly.net/",200,"text/html"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://cdn.segment.com/analytics.js/v1/ecd4a54afbfc9b437acdb998/analytics.min.js",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/fb99cd7312602bc20c68f1f7/analytics.min.js",200,"application/javascript"],["DELETE","https://api.daxly.net/v1/tickets/TCK-45522",204,"x-unknown"],["GET","https://api.daxly.net/favicon.ico",200,"image/x-icon"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://static.hotjar.com/c/hotjar-292733039.js?sv=6",200,"application/javascript"],["GET","https://api.daxly.net/__flags",200,"application/json"],["GET","https://api.daxly.net/robots.txt",200,"text/plain"],["GET","https://fonts.gstatic.com/s/inter/v13/b3c9792f6b1720adeeafa4c9.woff2",200,"font/woff2"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.daxly.net/__flags\",\n \"headers\": {\n \"host\": \"api.daxly.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.daxly.net\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.daxly.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"ce1eb18a\\\"}\"\n }\n }\n}","results":{"c1":[0.0,100.0,100.0,100.0,28.6,100.0,0.0],"c2a":[100.0,100.0,0.0,100.0,100.0,100.0,0.0],"c2b":[100.0,100.0,100.0,100.0,100.0,100.0,0.0]},"fails":{"c1":[3,-1,-1,-1,3,-1,3],"c2a":[-1,-1,3,-1,-1,-1,3],"c2b":[-1,-1,-1,-1,-1,-1,3]}},{"id":"tierb_34_bookings","suite":"tier_b","tier":"B","title":"Traik Bookings API","goal":"# Traik Bookings API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.traik.com/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:none","domain:bookings","base_path","noise"],"n_requests":23,"requests":[["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.traik.com/v1/items",200,"application/json"],["GET","https://api.traik.com/v1/items?room=Cedar",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=498860447&fmt=gif",204,"image/gif"],["GET","https://api.traik.com/manifest.json",200,"application/json"],["GET","https://api.traik.com/static/js/main.ac9339e0.js",200,"application/javascript"],["GET","https://api.traik.com/v1/items/BKG-56378",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.traik.com/static/js/main.e3e7ed55.js",200,"application/javascript"],["GET","https://api.traik.com/static/media/logo.95906a6e.svg",200,"image/svg+xml"],["GET","https://api.traik.com/v1/items/BKG-65274",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-927826020",200,"application/javascript"],["GET","https://fonts.gstatic.com/s/inter/v13/633517bd1ba5030dd81abed1.woff2",200,"font/woff2"],["POST","https://api.traik.com/v1/items",201,"application/json"],["GET","https://api.traik.com/",200,"text/html"],["PATCH","https://api.traik.com/v1/items/BKG-97852",200,"application/json"],["DELETE","https://api.traik.com/v1/items/BKG-84136",204,"x-unknown"],["GET","https://api.traik.com/__flags",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-764954413",200,"application/javascript"],["GET","https://api.traik.com/",200,"text/html"],["GET","https://api.traik.com/sockjs-node/info",200,"application/json"],["GET","https://api.traik.com/static/js/main.f5d5dd50.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.traik.com/v1/items\",\n \"headers\": {\n \"host\": \"api.traik.com\",\n \"connection\": \"keep-alive\",\n \"api-key\": \"sk_97aab7eac9d2beab59ba4e86\",\n \"origin\": \"https://app.traik.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.traik.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"[{\\\"id\\\":\\\"BKG-59094\\\",\\\"created_at\\\":\\\"2026-01-05T15:06:00Z\\\",\\\"guest\\\":\\\"Sofia Duarte\\\",\\\"room\\\":\\\"Ember\\\",\\\"starts_on\\\":\\\"2026-07-26\\\",\\\"nights\\\":4,\\\"party_size\\\":8,\\\"confirmed\\\":true},{\\\"id\\\":\\\"BKG-67370\\\",\\\"created_at\\\":\\\"2026-01-05T17:07:00Z\\\",\\\"guest\\\":\\\"Elin Berg\\\",\\\"room\\\":\\\"Aurora\\\",\\\"starts_on\\\":\\\"2026-04-10\\\",\\\"nights\\\":13,\\\"party_size\\\":8,\\\"confirmed\\\":true},{\\\"id\\\":\\\"BKG-88998\\\",\\\"created_at\\\":\\\"2026-01-05T18:34:00Z\\\",\\\"guest\\\":\\\"Marta Lindqvist\\\",\\\"room\\\":\\\"Birch\\\",\\\"starts_on\\\":\\\"2026-07-09\\\",\\\"nights\\\":9,\\\"party_size\\\":1,\\\"confirmed\\\":true},{\\\"id\\\":\\\"BKG-97411\\\",\\\"created_at\\\":\\\"2026-01-05T20:52:00Z\\\",\\\"guest\\\":\\\"Tomas Ito\\\",\\\"room\\\":\\\"Cedar\\\",\\\"starts_on\\\":\\\"2026-06-08\\\",\\\"nights\\\":3,\\\"party_size\\\":2,\\\"confirmed\\\":false},{\\\"id\\\":\\\"BKG-49496\\\",\\\"created_at\\\":\\\"2026-01-05T21:06:00Z\\\",\\\"\"","results":{"c1":[100.0,100.0,100.0,71.4,100.0,100.0,100.0],"c2a":[0.0,0.0,0.0,100.0,100.0,100.0,100.0],"c2b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c1":[-1,-1,-1,6,-1,-1,-1],"c2a":[0,3,3,-1,-1,-1,-1]}},{"id":"tierb_35_bookings","suite":"tier_b","tier":"B","title":"Torlo Bookings API","goal":"# Torlo Bookings API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.torlo.co/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:bookings","base_path","noise","token_expiry","etag_update","hidden_header","login_format:form"],"n_requests":37,"requests":[["GET","https://api.torlo.co/ping",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=381022730&fmt=gif",204,"image/gif"],["GET","https://api.torlo.co/sockjs-node/info",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-917145837&cid=917145837.917145837&en=page_view",204,"text/plain"],["GET","https://api.torlo.co/",200,"text/html"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.torlo.co/api/auth/token",200,"application/json"],["GET","https://api.torlo.co/api/bookings",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.torlo.co/api/bookings?room=Aurora",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-777374625&cid=777374625.777374625&en=page_view",204,"text/plain"],["GET","https://api.torlo.co/api/bookings/BKG-17740",200,"application/json"],["GET","https://api.torlo.co/static/js/main.6af1c25d.js",200,"application/javascript"],["GET","https://www.googletagmanager.com/gtag/js?id=G-771476145",200,"application/javascript"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.torlo.co/api/bookings/BKG-35903",200,"application/json"],["GET","https://api.torlo.co/static/media/logo.afb88e46.svg",200,"image/svg+xml"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-961970308&cid=961970308.961970308&en=page_view",204,"text/plain"],["GET","https://api.torlo.co/static/media/logo.86c59b59.svg",200,"image/svg+xml"],["POST","https://api.torlo.co/api/bookings",401,"application/json"],["POST","https://api.torlo.co/api/auth/token",200,"application/json"],["POST","https://api.torlo.co/api/bookings",201,"application/json"],["GET","https://api.torlo.co/robots.txt",200,"text/plain"],["GET","https://static.hotjar.com/c/hotjar-237767477.js?sv=6",200,"application/javascript"],["GET","https://api.torlo.co/static/js/main.699429f1.js",200,"application/javascript"],["GET","https://api.torlo.co/api/bookings/BKG-38695",200,"application/json"],["PATCH","https://api.torlo.co/api/bookings/BKG-38695",200,"application/json"],["GET","https://api.torlo.co/__flags",200,"application/json"],["GET","https://api.torlo.co/__flags",200,"application/json"],["DELETE","https://api.torlo.co/api/bookings/BKG-35863",204,"x-unknown"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://static.hotjar.com/c/hotjar-830408495.js?sv=6",200,"application/javascript"],["GET","https://api.torlo.co/static/media/logo.7fbaab06.svg",200,"image/svg+xml"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.torlo.co/static/media/logo.11a1badd.svg",200,"image/svg+xml"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.torlo.co/ping\",\n \"headers\": {\n \"host\": \"api.torlo.co\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.torlo.co\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.torlo.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"status\\\":\\\"ok\\\",\\\"t\\\":947211410}\"\n }\n }\n}","results":{"c1":[0.0,0.0,33.3,0.0,100.0,0.0,0.0],"c2a":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2b":[85.7,85.7,100.0,0.0,0.0,0.0,0.0]},"fails":{"c1":[1,1,1,1,-1,1,3],"c2a":[1,1,1,3,1,3,1],"c2b":[4,5,-1,3,3,1,3]}},{"id":"tierb_36_bookings","suite":"tier_b","tier":"B","title":"Havvo Bookings API","goal":"# Havvo Bookings API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havvo.app/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:bookings","base_path","noise","etag_update","envelope"],"n_requests":43,"requests":[["GET","https://px.ads.linkedin.com/collect?pid=334028339&fmt=gif",204,"image/gif"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://fonts.gstatic.com/s/inter/v13/cdc5e1b8f91389724f4e026c.woff2",200,"font/woff2"],["GET","https://api.havvo.app/api/bookings",200,"application/json"],["GET","https://api.havvo.app/api/bookings?skip=10",200,"application/json"],["GET","https://api.havvo.app/api/bookings?skip=20",200,"application/json"],["GET","https://api.havvo.app/api/bookings?skip=30",200,"application/json"],["GET","https://api.havvo.app/api/bookings?skip=40",200,"application/json"],["GET","https://api.havvo.app/static/media/logo.bf5a164e.svg",200,"image/svg+xml"],["GET","https://api.havvo.app/ping",200,"application/json"],["GET","https://api.havvo.app/api/bookings?room=Cedar",200,"application/json"],["GET","https://api.havvo.app/api/bookings?room=Cedar&skip=10",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.havvo.app/api/bookings/BKG-21208",200,"application/json"],["GET","https://api.havvo.app/sockjs-node/info",200,"application/json"],["GET","https://api.havvo.app/",200,"text/html"],["GET","https://api.havvo.app/api/bookings/BKG-97670",200,"application/json"],["GET","https://api.havvo.app/",200,"text/html"],["GET","https://www.googletagmanager.com/gtag/js?id=G-151282691",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-174349310&cid=174349310.174349310&en=page_view",204,"text/plain"],["GET","https://api.havvo.app/favicon.ico",200,"image/x-icon"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://api.havvo.app/api/bookings",201,"application/json"],["GET","https://api.havvo.app/static/css/main.c831ab11.css",200,"text/css"],["GET","https://api.havvo.app/static/css/main.1072b310.css",200,"text/css"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.havvo.app/robots.txt",200,"text/plain"],["GET","https://api.havvo.app/config.json",200,"application/json"],["GET","https://api.havvo.app/static/media/logo.aa46b305.svg",200,"image/svg+xml"],["GET","https://api.havvo.app/sockjs-node/info",200,"application/json"],["GET","https://api.havvo.app/manifest.json",200,"application/json"],["GET","https://api.havvo.app/api/bookings/BKG-15451",200,"application/json"],["PATCH","https://api.havvo.app/api/bookings/BKG-15451",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["DELETE","https://api.havvo.app/api/bookings/BKG-83251",204,"x-unknown"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=891937043&fmt=gif",204,"image/gif"],["GET","https://api.havvo.app/static/css/main.52430808.css",200,"text/css"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=185375346&fmt=gif",204,"image/gif"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.havvo.app/api/bookings\",\n \"headers\": {\n \"host\": \"api.havvo.app\",\n \"connection\": \"keep-alive\",\n \"x-api-key\": \"sk_685b64466515840502d9ccbf\",\n \"origin\": \"https://app.havvo.app\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havvo.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":[{\\\"id\\\":\\\"BKG-95648\\\",\\\"created_at\\\":\\\"2026-01-05T12:29:00Z\\\",\\\"guest\\\":\\\"Sofia Duarte\\\",\\\"room\\\":\\\"Cedar\\\",\\\"starts_on\\\":\\\"2026-12-06\\\",\\\"nights\\\":1,\\\"party_size\\\":2,\\\"confirmed\\\":false},{\\\"id\\\":\\\"BKG-13836\\\",\\\"created_at\\\":\\\"2026-01-05T13:52:00Z\\\",\\\"guest\\\":\\\"Marta Lindqvist\\\",\\\"room\\\":\\\"Dune\\\",\\\"starts_on\\\":\\\"2026-10-05\\\",\\\"nights\\\":11,\\\"party_size\\\":8,\\\"confirmed\\\":true},{\\\"id\\\":\\\"BKG-37391\\\",\\\"created_at\\\":\\\"2026-01-05T15:23:00Z\\\",\\\"guest\\\":\\\"Lena Brandt\\\",\\\"room\\\":\\\"Birch\\\",\\\"starts_on\\\":\\\"2026-08-19\\\",\\\"nights\\\":4,\\\"party_size\\\":5,\\\"confirmed\\\":true},{\\\"id\\\":\\\"BKG-57678\\\",\\\"created_at\\\":\\\"2026-01-05T15:39:00Z\\\",\\\"guest\\\":\\\"Marta Lindqvist\\\",\\\"room\\\":\\\"Birch\\\",\\\"starts_on\\\":\\\"2026-02-02\\\",\\\"nights\\\":8,\\\"party_size\\\":6,\\\"confirmed\\\":true},{\\\"id\\\":\\\"BKG-54917\\\",\\\"created_at\\\":\\\"2026","results":{"c1":[85.7,100.0,100.0,100.0,85.7,100.0,100.0],"c2a":[100.0,100.0,100.0,85.7,85.7,85.7,85.7],"c2b":[100.0,100.0,100.0,100.0,85.7,100.0,85.7]},"fails":{"c1":[5,-1,-1,-1,5,-1,-1],"c2a":[-1,-1,-1,5,5,5,5],"c2b":[-1,-1,-1,-1,5,-1,5]}},{"id":"tierb_37_bookings","suite":"tier_b","tier":"B","title":"Zanora Bookings API","goal":"# Zanora Bookings API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.zanora.dev/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:offset","domain:bookings","base_path","noise","token_expiry","hidden_header","envelope","login_format:json","csrf_in:json"],"n_requests":50,"requests":[["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.zanora.dev/__flags",200,"application/json"],["GET","https://api.zanora.dev/manifest.json",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://api.zanora.dev/v2/sessions",200,"application/json"],["GET","https://api.zanora.dev/v2/items",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/0dc7573befac618ba05524f7/analytics.min.js",200,"application/javascript"],["GET","https://static.hotjar.com/c/hotjar-928499690.js?sv=6",200,"application/javascript"],["GET","https://static.hotjar.com/c/hotjar-894733642.js?sv=6",200,"application/javascript"],["GET","https://api.zanora.dev/v2/items?skip=10",200,"application/json"],["GET","https://api.zanora.dev/ping",200,"application/json"],["GET","https://api.zanora.dev/v2/items?skip=20",200,"application/json"],["GET","https://api.zanora.dev/static/media/logo.f4e120e6.svg",200,"image/svg+xml"],["GET","https://static.hotjar.com/c/hotjar-744133006.js?sv=6",200,"application/javascript"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-870791498&cid=870791498.870791498&en=page_view",204,"text/plain"],["GET","https://api.zanora.dev/v2/items?room=Ember",200,"application/json"],["GET","https://api.zanora.dev/v2/items?room=Ember&skip=10",401,"application/json"],["POST","https://api.zanora.dev/v2/sessions",200,"application/json"],["GET","https://api.zanora.dev/__flags",200,"application/json"],["GET","https://api.zanora.dev/v2/items?room=Ember&skip=10",200,"application/json"],["POST","https://o969591875.ingest.sentry.io/api/969591875/envelope/?sentry_key=77e7178441f0d7c9ebb0997f",200,"application/json"],["POST","https://o38897453.ingest.sentry.io/api/38897453/envelope/?sentry_key=bea4ea844f63596862a454fb",200,"application/json"],["GET","https://api.zanora.dev/static/media/logo.a2ed99c8.svg",200,"image/svg+xml"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.zanora.dev/v2/items/BKG-83113",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=122583896&fmt=gif",204,"image/gif"],["GET","https://fonts.gstatic.com/s/inter/v13/2926c748c154aea80fa900db.woff2",200,"font/woff2"],["GET","https://api.zanora.dev/__flags",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=79960530&fmt=gif",204,"image/gif"],["GET","https://api.zanora.dev/sockjs-node/info",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.zanora.dev/v2/items/BKG-69647",200,"application/json"],["GET","https://api.zanora.dev/static/css/main.d8a1eada.css",200,"text/css"],["POST","https://api.zanora.dev/v2/items",201,"application/json"],["POST","https://o324343933.ingest.sentry.io/api/324343933/envelope/?sentry_key=18c7bed0483c110dbd20d9bd",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://cdn.segment.com/analytics.js/v1/5f8431b5b33fad9d3b212e65/analytics.min.js",200,"application/javascript"],["PATCH","https://api.zanora.dev/v2/items/BKG-82357",401,"application/json"],["POST","https://o970987505.ingest.sentry.io/api/970987505/envelope/?sentry_key=7dcbc2fb84c3719f74980c69",200,"application/json"],["POST","https://api.zanora.dev/v2/sessions",200,"application/json"],["PATCH","https://api.zanora.dev/v2/items/BKG-82357",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-690795394&cid=690795394.690795394&en=page_view",204,"text/plain"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["DELETE","https://api.zanora.dev/v2/items/BKG-44219",204,"x-unknown"],["GET","https://api.zanora.dev/",200,"text/html"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://o102385474.ingest.sentry.io/api/102385474/envelope/?sentry_key=560ed4f811459b601ef0f412",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.zanora.dev/__flags\",\n \"headers\": {\n \"host\": \"api.zanora.dev\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.zanora.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.zanora.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"49972e33\\\"}\"\n }\n }\n}","results":{"c1":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2a":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2b":[0.0,0.0,100.0,0.0,0.0,0.0,0.0]},"fails":{"c1":[3,1,1,1,3,3,3],"c2a":[3,1,1,3,2,3,3],"c2b":[3,1,-1,3,3,1,3]}},{"id":"tierb_38_invoices","suite":"tier_b","tier":"B","title":"Mirton Invoices API","goal":"# Mirton Invoices API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.mirton.net/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:invoices","base_path","noise","token_expiry","envelope","login_format:form","csrf_in:json"],"n_requests":57,"requests":[["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.mirton.net/static/media/logo.0af526e3.svg",200,"image/svg+xml"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.mirton.net/static/js/main.d1fe7d2a.js",200,"application/javascript"],["GET","https://api.mirton.net/manifest.json",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/5587f0ca73ad90d802af6b8b.woff2",200,"font/woff2"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.mirton.net/v2/auth/token",200,"application/json"],["GET","https://api.mirton.net/v2/invoices",200,"application/json"],["GET","https://api.mirton.net/v2/invoices?page_token=MTg1MmYzYTk6MTA",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.mirton.net/v2/invoices?page_token=MTg1MmYzYTk6MjA",200,"application/json"],["GET","https://api.mirton.net/v2/invoices?page_token=MTg1MmYzYTk6MzA",200,"application/json"],["GET","https://api.mirton.net/static/js/main.e3481f67.js",200,"application/javascript"],["GET","https://api.mirton.net/sockjs-node/info",200,"application/json"],["GET","https://api.mirton.net/sockjs-node/info",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-206675199&cid=206675199.206675199&en=page_view",204,"text/plain"],["GET","https://api.mirton.net/v2/invoices?state=draft",401,"application/json"],["POST","https://api.mirton.net/v2/auth/token",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/8943f5d927f60e4ccff755cc/analytics.min.js",200,"application/javascript"],["GET","https://api.mirton.net/v2/invoices?state=draft",200,"application/json"],["GET","https://api.mirton.net/static/js/main.3dddad55.js",200,"application/javascript"],["GET","https://api.mirton.net/v2/invoices?state=draft&page_token=MTg1MmYzYTk6MTA",200,"application/json"],["GET","https://api.mirton.net/v2/invoices?state=draft&page_token=MTg1MmYzYTk6MjA",200,"application/json"],["GET","https://api.mirton.net/ping",200,"application/json"],["GET","https://api.mirton.net/v2/invoices/INV-63170",200,"application/json"],["GET","https://api.mirton.net/robots.txt",200,"text/plain"],["GET","https://api.mirton.net/",200,"text/html"],["GET","https://api.mirton.net/ping",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.mirton.net/",200,"text/html"],["GET","https://api.mirton.net/v2/invoices/INV-18482",401,"application/json"],["POST","https://o424668964.ingest.sentry.io/api/424668964/envelope/?sentry_key=a0b06a6fd4f6d5da6bc46c85",200,"application/json"],["POST","https://api.mirton.net/v2/auth/token",200,"application/json"],["GET","https://api.mirton.net/v2/invoices/INV-18482",200,"application/json"],["GET","https://api.mirton.net/robots.txt",200,"text/plain"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-508715613&cid=508715613.508715613&en=page_view",204,"text/plain"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.mirton.net/favicon.ico",200,"image/x-icon"],["POST","https://api.mirton.net/v2/invoices",201,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-687206565&cid=687206565.687206565&en=page_view",204,"text/plain"],["GET","https://api.mirton.net/",200,"text/html"],["GET","https://fonts.gstatic.com/s/inter/v13/08f28681c68507fe5f30bec7.woff2",200,"font/woff2"],["GET","https://api.mirton.net/ping",200,"application/json"],["PATCH","https://api.mirton.net/v2/invoices/INV-49011",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-156844046",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=764823056&fmt=gif",204,"image/gif"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["DELETE","https://api.mirton.net/v2/invoices/INV-84217",204,"x-unknown"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-350876079&cid=350876079.350876079&en=page_view",204,"text/plain"],["GET","https://api.mirton.net/__flags",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-84296433.js?sv=6",200,"application/javascript"],["GET","https://api.mirton.net/robots.txt",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.mirton.net/manifest.json\",\n \"headers\": {\n \"host\": \"api.mirton.net\",\n \"connection\": \"keep-alive\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"manifest\",\n \"referer\": \"https://app.mirton.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"short_name\\\":\\\"App\\\",\\\"start_url\\\":\\\".\\\",\\\"display\\\":\\\"standalone\\\",\\\"icons\\\":[]}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,100.0,100.0,14.3],"c2a":[100.0,0.0,100.0,0.0,100.0,85.7,0.0],"c2b":[100.0,100.0,100.0,100.0,85.7,100.0,0.0]},"fails":{"c1":[-1,-1,-1,-1,-1,-1,4],"c2a":[-1,3,-1,3,-1,4,2],"c2b":[-1,-1,-1,-1,4,-1,3]}},{"id":"tierb_39_shipments","suite":"tier_b","tier":"B","title":"Quolo Shipments API","goal":"# Quolo Shipments API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quolo.net/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:offset","domain:shipments","base_path","noise","token_expiry","etag_update","login_format:form"],"n_requests":57,"requests":[["GET","https://api.quolo.net/",200,"text/html"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.quolo.net/config.json",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-709318820",200,"application/javascript"],["GET","https://api.quolo.net/static/js/main.ddee7fd8.js",200,"application/javascript"],["GET","https://static.hotjar.com/c/hotjar-684036190.js?sv=6",200,"application/javascript"],["GET","https://api.quolo.net/static/css/main.2e5e5a64.css",200,"text/css"],["GET","https://api.quolo.net/ping",200,"application/json"],["POST","https://api.quolo.net/v3/login",200,"application/json"],["GET","https://api.quolo.net/v3/shipments",200,"application/json"],["GET","https://api.quolo.net/v3/shipments?offset=10",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/4d352f29d9fc6b5f95baf651/analytics.min.js",200,"application/javascript"],["GET","https://api.quolo.net/v3/shipments?offset=20",200,"application/json"],["GET","https://api.quolo.net/v3/shipments?offset=30",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.quolo.net/favicon.ico",200,"image/x-icon"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.quolo.net/static/js/main.a04ae057.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://fonts.gstatic.com/s/inter/v13/03affde3d12455c35b36f8ed.woff2",200,"font/woff2"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/5de0918581bb8c4f71575fc6/analytics.min.js",200,"application/javascript"],["GET","https://api.quolo.net/v3/shipments?status=delivered",401,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/8a0cde41d9ae240c787b5f2f.woff2",200,"font/woff2"],["POST","https://api.quolo.net/v3/login",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.quolo.net/v3/shipments?status=delivered",200,"application/json"],["GET","https://api.quolo.net/v3/shipments?status=delivered&offset=10",200,"application/json"],["GET","https://api.quolo.net/sockjs-node/info",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.quolo.net/v3/shipments/SHP-82995",200,"application/json"],["POST","https://o987954059.ingest.sentry.io/api/987954059/envelope/?sentry_key=5bf1275cf4abdfbadb5d3858",200,"application/json"],["GET","https://api.quolo.net/v3/shipments/SHP-91964",200,"application/json"],["GET","https://api.quolo.net/",200,"text/html"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-884005931&cid=884005931.884005931&en=page_view",204,"text/plain"],["POST","https://api.quolo.net/v3/shipments",401,"application/json"],["POST","https://api.quolo.net/v3/login",200,"application/json"],["POST","https://api.quolo.net/v3/shipments",201,"application/json"],["GET","https://api.quolo.net/sockjs-node/info",200,"application/json"],["GET","https://api.quolo.net/static/js/main.622973f8.js",200,"application/javascript"],["GET","https://api.quolo.net/static/js/main.430c1ff1.js",200,"application/javascript"],["GET","https://api.quolo.net/static/css/main.68f2a4e9.css",200,"text/css"],["GET","https://api.quolo.net/v3/shipments/SHP-83064",200,"application/json"],["PATCH","https://api.quolo.net/v3/shipments/SHP-83064",200,"application/json"],["GET","https://api.quolo.net/__flags",200,"application/json"],["GET","https://api.quolo.net/manifest.json",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/f6e7608ffdb635a89dbc54ed.woff2",200,"font/woff2"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["DELETE","https://api.quolo.net/v3/shipments/SHP-98616",204,"x-unknown"],["GET","https://cdn.segment.com/analytics.js/v1/6b0a970284a78f9a60362471/analytics.min.js",200,"application/javascript"],["GET","https://api.quolo.net/ping",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.quolo.net\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.quolo.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,100.0,100.0,0.0],"c2a":[100.0,0.0,100.0,0.0,100.0,85.7,0.0],"c2b":[100.0,85.7,66.7,100.0,100.0,100.0,85.7]},"fails":{"c1":[-1,-1,-1,-1,-1,-1,4],"c2a":[-1,3,-1,2,-1,5,4],"c2b":[-1,5,3,-1,-1,-1,5]}},{"id":"tierb_40_invoices","suite":"tier_b","tier":"B","title":"Mirrix Invoices API","goal":"# Mirrix Invoices API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.mirrix.net/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:invoices","base_path","noise","token_expiry","etag_update","hidden_header","login_format:form","csrf_in:json"],"n_requests":37,"requests":[["GET","https://px.ads.linkedin.com/collect?pid=86056797&fmt=gif",204,"image/gif"],["GET","https://api.mirrix.net/",200,"text/html"],["GET","https://api.mirrix.net/__flags",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://api.mirrix.net/v2/auth/login",200,"application/json"],["GET","https://api.mirrix.net/",200,"text/html"],["GET","https://api.mirrix.net/v2/records",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-300430804.js?sv=6",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-52032122&cid=52032122.52032122&en=page_view",204,"text/plain"],["GET","https://api.mirrix.net/v2/records?state=sent",200,"application/json"],["POST","https://o363306773.ingest.sentry.io/api/363306773/envelope/?sentry_key=039d1cd3c3d2de087c08fe58",200,"application/json"],["GET","https://api.mirrix.net/static/css/main.84fb6101.css",200,"text/css"],["GET","https://api.mirrix.net/v2/records/INV-18783",200,"application/json"],["GET","https://api.mirrix.net/v2/records/INV-89745",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.mirrix.net/ping",200,"application/json"],["POST","https://api.mirrix.net/v2/records",401,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.mirrix.net/v2/auth/login",200,"application/json"],["POST","https://api.mirrix.net/v2/records",201,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-527771173&cid=527771173.527771173&en=page_view",204,"text/plain"],["GET","https://api.mirrix.net/favicon.ico",200,"image/x-icon"],["GET","https://api.mirrix.net/ping",200,"application/json"],["GET","https://api.mirrix.net/static/media/logo.a955dd07.svg",200,"image/svg+xml"],["GET","https://api.mirrix.net/v2/records/INV-35871",200,"application/json"],["PATCH","https://api.mirrix.net/v2/records/INV-35871",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.mirrix.net/ping",200,"application/json"],["POST","https://o817422366.ingest.sentry.io/api/817422366/envelope/?sentry_key=bd25ccaa15949cfcca29663e",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["DELETE","https://api.mirrix.net/v2/records/INV-41733",204,"x-unknown"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://o161460815.ingest.sentry.io/api/161460815/envelope/?sentry_key=5c2725da070ae46af51cab8f",200,"application/json"],["GET","https://api.mirrix.net/static/media/logo.f49505b5.svg",200,"image/svg+xml"],["GET","https://api.mirrix.net/robots.txt",200,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.mirrix.net/__flags\",\n \"headers\": {\n \"host\": \"api.mirrix.net\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.mirrix.net\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.mirrix.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"93f37168\\\"}\"\n }\n }\n}","results":{"c1":[0.0,85.7,95.2,0.0,0.0,100.0,0.0],"c2a":[0.0,0.0,100.0,0.0,57.1,28.6,0.0],"c2b":[85.7,100.0,90.5,0.0,0.0,85.7,0.0]},"fails":{"c1":[3,5,5,3,3,-1,3],"c2a":[3,3,-1,3,4,1,3],"c2b":[5,-1,4,3,3,5,3]}},{"id":"tierb_41_bookings","suite":"tier_b","tier":"B","title":"Fenora Bookings API","goal":"# Fenora Bookings API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.fenora.co/v2`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:cursor","domain:bookings","base_path","noise","hidden_header","envelope","login_format:form","csrf_in:json"],"n_requests":43,"requests":[["GET","https://api.fenora.co/__flags",200,"application/json"],["GET","https://api.fenora.co/favicon.ico",200,"image/x-icon"],["GET","https://api.fenora.co/static/media/logo.27af998b.svg",200,"image/svg+xml"],["POST","https://api.fenora.co/v2/sessions",200,"application/json"],["GET","https://api.fenora.co/v2/items",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/d49aff68595ed34f7d77346f/analytics.min.js",200,"application/javascript"],["GET","https://api.fenora.co/sockjs-node/info",200,"application/json"],["GET","https://api.fenora.co/v2/items?after=NjYwOTE1YTk6MTA",200,"application/json"],["GET","https://api.fenora.co/v2/items?after=NjYwOTE1YTk6MjA",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/96ed9a86d30045225ab1a06c.woff2",200,"font/woff2"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.fenora.co/v2/items?after=NjYwOTE1YTk6MzA",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.fenora.co/static/css/main.32bd6192.css",200,"text/css"],["GET","https://api.fenora.co/v2/items?room=Dune",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-782407183&cid=782407183.782407183&en=page_view",204,"text/plain"],["GET","https://api.fenora.co/v2/items?room=Dune&after=NjYwOTE1YTk6MTA",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.fenora.co/v2/items?room=Dune&after=NjYwOTE1YTk6MjA",200,"application/json"],["GET","https://api.fenora.co/",200,"text/html"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=454106446&fmt=gif",204,"image/gif"],["GET","https://api.fenora.co/static/media/logo.507f8d2b.svg",200,"image/svg+xml"],["POST","https://o576962827.ingest.sentry.io/api/576962827/envelope/?sentry_key=1e7388623a10309814d66a83",200,"application/json"],["GET","https://api.fenora.co/v2/items/BKG-95333",200,"application/json"],["GET","https://api.fenora.co/v2/items/BKG-93918",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-866620978",200,"application/javascript"],["GET","https://api.fenora.co/manifest.json",200,"application/json"],["POST","https://api.fenora.co/v2/items",201,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["PATCH","https://api.fenora.co/v2/items/BKG-20246",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.fenora.co/",200,"text/html"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["DELETE","https://api.fenora.co/v2/items/BKG-89885",204,"x-unknown"],["GET","https://api.fenora.co/config.json",200,"application/json"],["POST","https://o729509706.ingest.sentry.io/api/729509706/envelope/?sentry_key=9b0b58e537ce8e30dcc95f7f",200,"application/json"],["GET","https://api.fenora.co/config.json",200,"application/json"],["GET","https://api.fenora.co/robots.txt",200,"text/plain"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://cdn.segment.com/analytics.js/v1/d114bdfa5111b3b737f8d57a/analytics.min.js",200,"application/javascript"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.fenora.co/__flags\",\n \"headers\": {\n \"host\": \"api.fenora.co\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.fenora.co\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.fenora.co/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"6804ad8e\\\"}\"\n }\n }\n}","results":{"c1":[0.0,0.0,66.7,0.0,0.0,100.0,0.0],"c2a":[0.0,0.0,0.0,100.0,100.0,0.0,0.0],"c2b":[100.0,100.0,100.0,0.0,0.0,100.0,0.0]},"fails":{"c1":[3,3,1,3,3,-1,3],"c2a":[3,3,3,-1,-1,3,3],"c2b":[-1,-1,-1,3,3,-1,3]}},{"id":"tierb_42_invoices","suite":"tier_b","tier":"B","title":"Nimium Invoices API","goal":"# Nimium Invoices API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.nimium.app/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns an invoice returns the invoice object itself, not a wrapper around it.\n\n- `list_invoices(state: str | None = None) -> list[dict]`: Return every invoice, across all pages, in the order the server gives them. When `state` is given, return only the invoices whose `state` equals it.\n- `get_invoice(id: str) -> dict`: Return the invoice with this id.\n- `create_invoice(body: dict) -> dict`: Create an invoice from `body` (a JSON object with the invoice fields). Return the created invoice.\n- `update_invoice(id: str, changes: dict) -> dict`: Change the given fields of an invoice. Return the updated invoice.\n- `delete_invoice(id: str) -> None`: Delete the invoice. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:offset","domain:invoices","base_path","noise","etag_update","hidden_header","envelope"],"n_requests":37,"requests":[["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-850286299&cid=850286299.850286299&en=page_view",204,"text/plain"],["GET","https://api.nimium.app/config.json",200,"application/json"],["GET","https://api.nimium.app/api/invoices",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=533844756&fmt=gif",204,"image/gif"],["GET","https://api.nimium.app/api/invoices?start=10",200,"application/json"],["GET","https://api.nimium.app/api/invoices?start=20",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=668897092&fmt=gif",204,"image/gif"],["GET","https://static.hotjar.com/c/hotjar-950443119.js?sv=6",200,"application/javascript"],["GET","https://api.nimium.app/favicon.ico",200,"image/x-icon"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.nimium.app/api/invoices?state=paid",200,"application/json"],["GET","https://api.nimium.app/api/invoices?state=paid&start=10",200,"application/json"],["POST","https://o318025811.ingest.sentry.io/api/318025811/envelope/?sentry_key=335a89e137b21c9532622251",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.nimium.app/ping",200,"application/json"],["GET","https://api.nimium.app/api/invoices/INV-61193",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=641476310&fmt=gif",204,"image/gif"],["GET","https://api.nimium.app/",200,"text/html"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://static.hotjar.com/c/hotjar-937161801.js?sv=6",200,"application/javascript"],["GET","https://api.nimium.app/",200,"text/html"],["GET","https://api.nimium.app/favicon.ico",200,"image/x-icon"],["GET","https://api.nimium.app/api/invoices/INV-52598",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.nimium.app/api/invoices",201,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-556041569&cid=556041569.556041569&en=page_view",204,"text/plain"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.nimium.app/api/invoices/INV-27501",200,"application/json"],["PATCH","https://api.nimium.app/api/invoices/INV-27501",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.nimium.app/ping",200,"application/json"],["POST","https://o57479201.ingest.sentry.io/api/57479201/envelope/?sentry_key=ff15b2e2e0e09affecfed4a2",200,"application/json"],["DELETE","https://api.nimium.app/api/invoices/INV-73162",204,"x-unknown"],["GET","https://api.nimium.app/__flags",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.nimium.app/config.json\",\n \"headers\": {\n \"host\": \"api.nimium.app\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.nimium.app\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.nimium.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"env\\\":\\\"production\\\",\\\"release\\\":\\\"57b3acc6\\\",\\\"features\\\":[\\\"search\\\",\\\"export\\\"],\\\"telemetry\\\":true}\"\n }\n }\n}","results":{"c1":[0.0,0.0,66.7,0.0,0.0,100.0,0.0],"c2a":[0.0,0.0,0.0,0.0,85.7,100.0,0.0],"c2b":[0.0,100.0,100.0,100.0,85.7,100.0,100.0]},"fails":{"c1":[1,1,1,1,2,-1,1],"c2a":[1,1,3,1,5,-1,1],"c2b":[1,-1,-1,-1,5,-1,-1]}},{"id":"tierb_43_samples","suite":"tier_b","tier":"B","title":"Zanrix Samples API","goal":"# Zanrix Samples API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.zanrix.net/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:cookie_csrf","pagination:none","domain:samples","base_path","noise","token_expiry","envelope","login_format:form","csrf_in:json"],"n_requests":33,"requests":[["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-90039052&cid=90039052.90039052&en=page_view",204,"text/plain"],["POST","https://o676838903.ingest.sentry.io/api/676838903/envelope/?sentry_key=5e9c492ceb88d6912efa1b51",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["POST","https://api.zanrix.net/api/auth/login",200,"application/json"],["GET","https://api.zanrix.net/api/samples",200,"application/json"],["GET","https://api.zanrix.net/sockjs-node/info",200,"application/json"],["GET","https://api.zanrix.net/robots.txt",200,"text/plain"],["GET","https://api.zanrix.net/static/css/main.280ae717.css",200,"text/css"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.zanrix.net/api/samples?lab=north",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/ce27e0386a3fa4c5ace3806e.woff2",200,"font/woff2"],["GET","https://api.zanrix.net/api/samples/SMP-93541",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-645705094",200,"application/javascript"],["GET","https://api.zanrix.net/robots.txt",200,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.zanrix.net/sockjs-node/info",200,"application/json"],["GET","https://api.zanrix.net/api/samples/SMP-87698",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-647502027.js?sv=6",200,"application/javascript"],["POST","https://api.zanrix.net/api/samples",401,"application/json"],["POST","https://api.zanrix.net/api/auth/login",200,"application/json"],["POST","https://api.zanrix.net/api/samples",201,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["PATCH","https://api.zanrix.net/api/samples/SMP-72801",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-553841326&cid=553841326.553841326&en=page_view",204,"text/plain"],["GET","https://fonts.gstatic.com/s/inter/v13/66bb0f9b1ccf09eb71704c92.woff2",200,"font/woff2"],["GET","https://api.zanrix.net/config.json",200,"application/json"],["DELETE","https://api.zanrix.net/api/samples/SMP-58972",204,"x-unknown"],["GET","https://api.zanrix.net/favicon.ico",200,"image/x-icon"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://px.ads.linkedin.com/collect?pid=387114964&fmt=gif",204,"image/gif"],["GET","https://api.zanrix.net/favicon.ico",200,"image/x-icon"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o676838903.ingest.sentry.io/api/676838903/envelope/?sentry_key=5e9c492ceb88d6912efa1b51\",\n \"headers\": {\n \"host\": \"o676838903.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.zanrix.net\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.zanrix.net/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"d8326428ef4768e28749b446\\\"}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,57.1,100.0,100.0],"c2a":[100.0,28.6,85.7,100.0,100.0,100.0,57.1],"c2b":[0.0,85.7,100.0,100.0,100.0,100.0,57.1]},"fails":{"c1":[-1,-1,-1,-1,4,-1,-1],"c2a":[-1,4,4,-1,-1,-1,4],"c2b":[0,4,-1,-1,-1,-1,4]}},{"id":"tierb_44_shipments","suite":"tier_b","tier":"B","title":"Quoly Shipments API","goal":"# Quoly Shipments API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.quoly.io/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:shipments","base_path","noise","hidden_header","login_format:json"],"n_requests":37,"requests":[["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-585434150&cid=585434150.585434150&en=page_view",204,"text/plain"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://www.googletagmanager.com/gtag/js?id=G-318319659",200,"application/javascript"],["POST","https://api.quoly.io/v3/login",200,"application/json"],["GET","https://api.quoly.io/static/js/main.9e071c04.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.quoly.io/v3/records",200,"application/json"],["GET","https://api.quoly.io/v3/records?p=2",200,"application/json"],["GET","https://api.quoly.io/v3/records?p=3",200,"application/json"],["GET","https://api.quoly.io/v3/records?status=delivered",200,"application/json"],["GET","https://api.quoly.io/v3/records?status=delivered&p=2",200,"application/json"],["GET","https://api.quoly.io/static/css/main.11c63a85.css",200,"text/css"],["GET","https://api.quoly.io/v3/records/SHP-47504",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/ac1520215eb3f3f7161d13b4/analytics.min.js",200,"application/javascript"],["GET","https://api.quoly.io/__flags",200,"application/json"],["GET","https://api.quoly.io/v3/records/SHP-25416",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.quoly.io/config.json",200,"application/json"],["GET","https://api.quoly.io/static/css/main.650cf66e.css",200,"text/css"],["POST","https://api.quoly.io/v3/records",201,"application/json"],["GET","https://api.quoly.io/static/media/logo.654852fe.svg",200,"image/svg+xml"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.quoly.io/favicon.ico",200,"image/x-icon"],["GET","https://api.quoly.io/static/css/main.38b639f7.css",200,"text/css"],["PATCH","https://api.quoly.io/v3/records/SHP-79218",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.quoly.io/robots.txt",200,"text/plain"],["DELETE","https://api.quoly.io/v3/records/SHP-18561",204,"x-unknown"],["GET","https://api.quoly.io/sockjs-node/info",200,"application/json"],["GET","https://cdn.segment.com/analytics.js/v1/d04472d07a1f851930e2562c/analytics.min.js",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-806716361&cid=806716361.806716361&en=page_view",204,"text/plain"],["GET","https://api.quoly.io/config.json",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-339475077",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.quoly.io\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.quoly.io/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}","results":{"c1":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2a":[0.0,0.0,0.0,0.0,100.0,0.0,0.0],"c2b":[0.0,0.0,66.7,100.0,0.0,0.0,0.0]},"fails":{"c1":[1,1,1,0,3,3,3],"c2a":[1,3,1,3,-1,1,3],"c2b":[1,1,1,-1,3,1,3]}},{"id":"tierb_45_bookings","suite":"tier_b","tier":"B","title":"Brona Bookings API","goal":"# Brona Bookings API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.brona.dev/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a booking returns the booking object itself, not a wrapper around it.\n\n- `list_bookings(room: str | None = None) -> list[dict]`: Return every booking, across all pages, in the order the server gives them. When `room` is given, return only the bookings whose `room` equals it.\n- `get_booking(id: str) -> dict`: Return the booking with this id.\n- `create_booking(body: dict) -> dict`: Create a booking from `body` (a JSON object with the booking fields). Return the created booking.\n- `update_booking(id: str, changes: dict) -> dict`: Change the given fields of a booking. Return the updated booking.\n- `delete_booking(id: str) -> None`: Delete the booking. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:bookings","base_path","noise","token_expiry","etag_update","envelope","login_format:json"],"n_requests":57,"requests":[["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.brona.dev/__flags",200,"application/json"],["POST","https://api.brona.dev/v3/auth/login",200,"application/json"],["GET","https://api.brona.dev/v3/bookings",200,"application/json"],["GET","https://api.brona.dev/",200,"text/html"],["GET","https://api.brona.dev/v3/bookings?p=2",200,"application/json"],["GET","https://api.brona.dev/v3/bookings?p=3",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.brona.dev/v3/bookings?p=4",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.brona.dev/ping",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=388038435&fmt=gif",204,"image/gif"],["GET","https://static.hotjar.com/c/hotjar-396034291.js?sv=6",200,"application/javascript"],["GET","https://api.brona.dev/v3/bookings?room=Dune",401,"application/json"],["POST","https://api.brona.dev/v3/auth/login",200,"application/json"],["GET","https://api.brona.dev/v3/bookings?room=Dune",200,"application/json"],["GET","https://api.brona.dev/v3/bookings?room=Dune&p=2",200,"application/json"],["GET","https://api.brona.dev/v3/bookings/BKG-77425",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://api.brona.dev/v3/bookings/BKG-92495",200,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-699972571&cid=699972571.699972571&en=page_view",204,"text/plain"],["GET","https://api.brona.dev/ping",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-159143764.js?sv=6",200,"application/javascript"],["GET","https://api.brona.dev/static/js/main.4bf313dd.js",200,"application/javascript"],["GET","https://api.brona.dev/static/media/logo.2784d591.svg",200,"image/svg+xml"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.brona.dev/v3/bookings",401,"application/json"],["POST","https://api.brona.dev/v3/auth/login",200,"application/json"],["POST","https://api.brona.dev/v3/bookings",201,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-108942021&cid=108942021.108942021&en=page_view",204,"text/plain"],["GET","https://api.brona.dev/__flags",200,"application/json"],["GET","https://api.brona.dev/sockjs-node/info",200,"application/json"],["GET","https://api.brona.dev/static/js/main.09286f61.js",200,"application/javascript"],["GET","https://api.brona.dev/v3/bookings/BKG-27414",200,"application/json"],["PATCH","https://api.brona.dev/v3/bookings/BKG-27414",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/c57ea331419d20d9ef5df7f6.woff2",200,"font/woff2"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-905215275&cid=905215275.905215275&en=page_view",204,"text/plain"],["DELETE","https://api.brona.dev/v3/bookings/BKG-97031",204,"x-unknown"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.brona.dev/",200,"text/html"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-444810838&cid=444810838.444810838&en=page_view",204,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.brona.dev/static/js/main.b9d7327f.js",200,"application/javascript"],["GET","https://api.brona.dev/",200,"text/html"],["GET","https://api.brona.dev/static/js/main.36551d21.js",200,"application/javascript"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.brona.dev/config.json",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://static.hotjar.com/c/hotjar-944865855.js?sv=6",200,"application/javascript"],["POST","https://o529857013.ingest.sentry.io/api/529857013/envelope/?sentry_key=78136784c89567314b8005b0",200,"application/json"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.brona.dev/__flags\",\n \"headers\": {\n \"host\": \"api.brona.dev\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.brona.dev\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.brona.dev/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"1d3072af\\\"}\"\n }\n }\n}","results":{"c1":[100.0,100.0,100.0,100.0,0.0,100.0,0.0],"c2a":[71.4,85.7,100.0,0.0,14.3,100.0,14.3],"c2b":[100.0,100.0,100.0,100.0,100.0,100.0,0.0]},"fails":{"c1":[-1,-1,-1,-1,0,-1,4],"c2a":[3,3,-1,0,3,-1,4],"c2b":[-1,-1,-1,-1,-1,-1,4]}},{"id":"tierb_46_samples","suite":"tier_b","tier":"B","title":"Veldex Samples API","goal":"# Veldex Samples API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.veldex.app/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a sample returns the sample object itself, not a wrapper around it.\n\n- `list_samples(lab: str | None = None) -> list[dict]`: Return every sample, across all pages, in the order the server gives them. When `lab` is given, return only the samples whose `lab` equals it.\n- `get_sample(id: str) -> dict`: Return the sample with this id.\n- `create_sample(body: dict) -> dict`: Create a sample from `body` (a JSON object with the sample fields). Return the created sample.\n- `update_sample(id: str, changes: dict) -> dict`: Change the given fields of a sample. Return the updated sample.\n- `delete_sample(id: str) -> None`: Delete the sample. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:offset","domain:samples","base_path","noise","hidden_header","envelope","login_format:form"],"n_requests":37,"requests":[["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.veldex.app/static/media/logo.d7ea85cc.svg",200,"image/svg+xml"],["GET","https://api.veldex.app/static/media/logo.9eed3480.svg",200,"image/svg+xml"],["POST","https://api.veldex.app/api/auth/token",200,"application/json"],["GET","https://api.veldex.app/api/records",200,"application/json"],["GET","https://api.veldex.app/config.json",200,"application/json"],["GET","https://api.veldex.app/api/records?offset=10",200,"application/json"],["GET","https://api.veldex.app/static/media/logo.cfd2200c.svg",200,"image/svg+xml"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://api.veldex.app/api/records?offset=20",200,"application/json"],["GET","https://api.veldex.app/sockjs-node/info",200,"application/json"],["GET","https://api.veldex.app/api/records?lab=north",200,"application/json"],["GET","https://api.veldex.app/favicon.ico",200,"image/x-icon"],["GET","https://api.veldex.app/api/records?lab=north&offset=10",200,"application/json"],["GET","https://fonts.gstatic.com/s/inter/v13/e0872f48ed29050010cd267d.woff2",200,"font/woff2"],["GET","https://api.veldex.app/static/css/main.608848be.css",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=955578984&fmt=gif",204,"image/gif"],["GET","https://api.veldex.app/api/records/SMP-73178",200,"application/json"],["GET","https://api.veldex.app/sockjs-node/info",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-282613018",200,"application/javascript"],["POST","https://o811045158.ingest.sentry.io/api/811045158/envelope/?sentry_key=9f8cf0c0ff6622ddde593ff2",200,"application/json"],["GET","https://api.veldex.app/api/records/SMP-66305",200,"application/json"],["GET","https://api.veldex.app/sockjs-node/info",200,"application/json"],["GET","https://api.veldex.app/static/media/logo.2c0d4337.svg",200,"image/svg+xml"],["POST","https://api.veldex.app/api/records",201,"application/json"],["GET","https://api.veldex.app/favicon.ico",200,"image/x-icon"],["GET","https://api.veldex.app/favicon.ico",200,"image/x-icon"],["PATCH","https://api.veldex.app/api/records/SMP-66408",200,"application/json"],["GET","https://api.veldex.app/robots.txt",200,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.segment.io/v1/t",200,"application/json"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/94be8416285246b4b5e163c7/analytics.min.js",200,"application/javascript"],["DELETE","https://api.veldex.app/api/records/SMP-74540",204,"x-unknown"],["GET","https://static.hotjar.com/c/hotjar-832385250.js?sv=6",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.veldex.app/api/auth/token\",\n \"headers\": {\n \"host\": \"api.veldex.app\",\n \"connection\": \"keep-alive\",\n \"x-app-build\": \"2148\",\n \"origin\": \"https://app.veldex.app\",\n \"content-type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.veldex.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"data\\\":{\\\"token\\\":\\\"tok_94d4d493d26ef152eb72a378\\\",\\\"token_type\\\":\\\"Bearer\\\",\\\"expires_in\\\":3600},\\\"meta\\\":{\\\"request_id\\\":\\\"req_000001\\\"}}\"\n }\n }\n}","results":{"c1":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2a":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2b":[0.0,71.4,100.0,0.0,0.0,100.0,0.0]},"fails":{"c1":[1,1,1,1,3,1,3],"c2a":[1,3,1,1,3,3,1],"c2b":[1,9,-1,3,3,-1,3]}},{"id":"tierb_47_shipments","suite":"tier_b","tier":"B","title":"Havora Shipments API","goal":"# Havora Shipments API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.havora.com/v3`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:apikey_header","pagination:none","domain:shipments","base_path","noise"],"n_requests":23,"requests":[["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.havora.com/__flags",200,"application/json"],["GET","https://api.havora.com/manifest.json",200,"application/json"],["GET","https://api.havora.com/",200,"text/html"],["GET","https://api.havora.com/manifest.json",200,"application/json"],["GET","https://api.havora.com/v3/shipments",200,"application/json"],["GET","https://api.havora.com/v3/shipments?status=delivered",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://api.havora.com/v3/shipments/SHP-70590",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://api.havora.com/v3/shipments/SHP-16135",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["POST","https://api.havora.com/v3/shipments",201,"application/json"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-880592754&cid=880592754.880592754&en=page_view",204,"text/plain"],["GET","https://api.havora.com/static/js/main.003171f2.js",200,"application/javascript"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["PATCH","https://api.havora.com/v3/shipments/SHP-15436",200,"application/json"],["DELETE","https://api.havora.com/v3/shipments/SHP-96606",204,"x-unknown"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://api.havora.com/__flags",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-544671702.js?sv=6",200,"application/javascript"],["POST","https://www.google-analytics.com/g/collect?v=2&tid=G-66927284&cid=66927284.66927284&en=page_view",204,"text/plain"]],"excerpt":"{\n \"request\": {\n \"method\": \"GET\",\n \"url\": \"https://api.havora.com/__flags\",\n \"headers\": {\n \"host\": \"api.havora.com\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.havora.com\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"application/json\",\n \"sec-fetch-site\": \"same-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.havora.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"flags\\\":{\\\"newNav\\\":true,\\\"betaBanner\\\":false,\\\"exportV2\\\":true},\\\"etag\\\":\\\"6b7ded66\\\"}\"\n }\n }\n}","results":{"c1":[0.0,100.0,100.0,100.0,100.0,100.0,100.0],"c2a":[0.0,100.0,100.0,71.4,100.0,100.0,100.0],"c2b":[100.0,100.0,100.0,100.0,100.0,100.0,100.0]},"fails":{"c1":[0,-1,-1,-1,-1,-1,-1],"c2a":[0,-1,-1,3,-1,-1,-1]}},{"id":"tierb_48_tickets","suite":"tier_b","tier":"B","title":"Lumora Tickets API","goal":"# Lumora Tickets API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.lumora.com/api`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a ticket returns the ticket object itself, not a wrapper around it.\n\n- `list_tickets(priority: str | None = None) -> list[dict]`: Return every ticket, across all pages, in the order the server gives them. When `priority` is given, return only the tickets whose `priority` equals it.\n- `get_ticket(id: str) -> dict`: Return the ticket with this id.\n- `create_ticket(body: dict) -> dict`: Create a ticket from `body` (a JSON object with the ticket fields). Return the created ticket.\n- `update_ticket(id: str, changes: dict) -> dict`: Change the given fields of a ticket. Return the updated ticket.\n- `delete_ticket(id: str) -> None`: Delete the ticket. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:link_header","domain:tickets","base_path","noise","etag_update","hidden_header","envelope","login_format:form"],"n_requests":40,"requests":[["POST","https://o288914386.ingest.sentry.io/api/288914386/envelope/?sentry_key=88d0c106a8ef07eddc2d892d",200,"application/json"],["GET","https://api.lumora.com/",200,"text/html"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/85f420f6200a7892ac2ec246/analytics.min.js",200,"application/javascript"],["GET","https://api.lumora.com/static/media/logo.60a17798.svg",200,"image/svg+xml"],["POST","https://api.lumora.com/api/auth/token",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.lumora.com/api/tickets",200,"application/json"],["GET","https://api.lumora.com/config.json",200,"application/json"],["GET","https://api.lumora.com/api/tickets?page=2",200,"application/json"],["GET","https://api.lumora.com/api/tickets?page=3",200,"application/json"],["GET","https://api.lumora.com/__flags",200,"application/json"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://api.lumora.com/api/tickets?priority=normal",200,"application/json"],["GET","https://api.lumora.com/api/tickets?priority=normal&page=2",200,"application/json"],["GET","https://api.lumora.com/config.json",200,"application/json"],["GET","https://connect.facebook.net/en_US/fbevents.js",200,"application/javascript"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://px.ads.linkedin.com/collect?pid=130765432&fmt=gif",204,"image/gif"],["GET","https://api.lumora.com/api/tickets/TCK-47788",200,"application/json"],["GET","https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js",200,"application/javascript"],["GET","https://api.lumora.com/__flags",200,"application/json"],["GET","https://api.lumora.com/favicon.ico",200,"image/x-icon"],["GET","https://api.lumora.com/",200,"text/html"],["GET","https://cdn.segment.com/analytics.js/v1/0745014a7deba91780bbdd94/analytics.min.js",200,"application/javascript"],["GET","https://api.lumora.com/api/tickets/TCK-35458",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-917999510.js?sv=6",200,"application/javascript"],["POST","https://api.lumora.com/api/tickets",201,"application/json"],["GET","https://api.lumora.com/api/tickets/TCK-21219",200,"application/json"],["PATCH","https://api.lumora.com/api/tickets/TCK-21219",200,"application/json"],["GET","https://www.googletagmanager.com/gtag/js?id=G-208889550",200,"application/javascript"],["GET","https://api.lumora.com/static/media/logo.8b987ae7.svg",200,"image/svg+xml"],["GET","https://api.lumora.com/",200,"text/html"],["DELETE","https://api.lumora.com/api/tickets/TCK-57034",204,"x-unknown"],["GET","https://js-agent.newrelic.com/nr-loader-spa-1.250.0.min.js",200,"application/javascript"],["GET","https://browser.sentry-cdn.com/7.100.0/bundle.tracing.min.js",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/a6e9f574d50a66e205fb3716/analytics.min.js",200,"application/javascript"],["GET","https://api.lumora.com/static/js/main.d33ba0be.js",200,"application/javascript"],["GET","https://cdn.segment.com/analytics.js/v1/1811dc6f66bb499d2ead532c/analytics.min.js",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://o288914386.ingest.sentry.io/api/288914386/envelope/?sentry_key=88d0c106a8ef07eddc2d892d\",\n \"headers\": {\n \"host\": \"o288914386.ingest.sentry.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.lumora.com\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.lumora.com/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"id\\\":\\\"40ad3dd2adda95839424e845\\\"}\"\n }\n }\n}","results":{"c1":[0.0,0.0,66.7,0.0,0.0,100.0,0.0],"c2a":[0.0,0.0,0.0,0.0,0.0,0.0,0.0],"c2b":[100.0,100.0,100.0,0.0,0.0,100.0,0.0]},"fails":{"c1":[1,1,1,3,1,-1,3],"c2a":[3,3,1,3,3,3,3],"c2b":[-1,-1,-1,3,3,-1,1]}},{"id":"tierb_49_shipments","suite":"tier_b","tier":"B","title":"Tralo Shipments API","goal":"# Tralo Shipments API\n\nWrite one Python file, `client.py`, that defines `class Client` for this API.\nThe file `session.har` is a browser recording of a user session. It holds real\nrequests and responses for this API, mixed with unrelated traffic.\n\n## Constructor\n\n`Client(base_url: str, username: str, password: str)`\n\n- `base_url` is the API root and already includes any base path, with no trailing slash.\n In the recording it looks like `https://api.tralo.app/v1`. Tests use another host and port.\n- `username` and `password` are the account credentials. Some APIs use a single API key\n instead of a login; for those, `password` is the API key and `username` is not used.\n\n## Methods\n\nTests call these methods in order, all on one `Client` instance, so anything the client\nkeeps (such as a login session) carries over from call to call. Each argument is a keyword\nargument. A method that returns a shipment returns the shipment object itself, not a wrapper around it.\n\n- `list_shipments(status: str | None = None) -> list[dict]`: Return every shipment, across all pages, in the order the server gives them. When `status` is given, return only the shipments whose `status` equals it.\n- `get_shipment(id: str) -> dict`: Return the shipment with this id.\n- `create_shipment(body: dict) -> dict`: Create a shipment from `body` (a JSON object with the shipment fields). Return the created shipment.\n- `update_shipment(id: str, changes: dict) -> dict`: Change the given fields of a shipment. Return the updated shipment.\n- `delete_shipment(id: str) -> None`: Delete the shipment. Return `None`.\n\n## Rules\n\n- Use only `httpx`, `requests` and the standard library.\n- Do not hard-code the host or any credential. Use `base_url`, `username` and `password`.\n- Add no methods for endpoints that are not listed.\n- Tests run against a fresh server with new data and new credentials.\n- `client.py` must import everything it uses (for example `from typing import Any` for the return annotations).\n","features":["tier:B","auth:bearer_login","pagination:none","domain:shipments","base_path","noise","hidden_header","envelope","login_format:form"],"n_requests":27,"requests":[["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.segment.io/v1/t",200,"application/json"],["POST","https://api.tralo.app/v1/auth/login",200,"application/json"],["GET","https://api.tralo.app/v1/items",200,"application/json"],["GET","https://api.tralo.app/config.json",200,"application/json"],["GET","https://api.tralo.app/v1/items?status=pending",200,"application/json"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://www.googletagmanager.com/gtag/js?id=G-817881272",200,"application/javascript"],["GET","https://api.tralo.app/v1/items/SHP-60400",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://static.hotjar.com/c/hotjar-57472101.js?sv=6",200,"application/javascript"],["GET","https://api.tralo.app/v1/items/SHP-60433",200,"application/json"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://px.ads.linkedin.com/collect?pid=198685131&fmt=gif",204,"image/gif"],["GET","https://api.tralo.app/__flags",200,"application/json"],["POST","https://api.mixpanel.com/track?ip=1",200,"text/plain"],["GET","https://api.tralo.app/sockjs-node/info",200,"application/json"],["POST","https://o569847413.ingest.sentry.io/api/569847413/envelope/?sentry_key=e55419b78b36a41c70cbd71d",200,"application/json"],["POST","https://api.tralo.app/v1/items",201,"application/json"],["PATCH","https://api.tralo.app/v1/items/SHP-21514",200,"application/json"],["GET","https://px.ads.linkedin.com/collect?pid=800814864&fmt=gif",204,"image/gif"],["DELETE","https://api.tralo.app/v1/items/SHP-48088",204,"x-unknown"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["GET","https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css",200,"text/css"],["GET","https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap",200,"text/css"],["POST","https://o371017694.ingest.sentry.io/api/371017694/envelope/?sentry_key=2a4dfd50566096e38bd62c0a",200,"application/json"],["GET","https://static.hotjar.com/c/hotjar-315147723.js?sv=6",200,"application/javascript"]],"excerpt":"{\n \"request\": {\n \"method\": \"POST\",\n \"url\": \"https://api.segment.io/v1/t\",\n \"headers\": {\n \"host\": \"api.segment.io\",\n \"connection\": \"keep-alive\",\n \"origin\": \"https://app.tralo.app\",\n \"content-type\": \"application/json\",\n \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\n \"accept\": \"*/*\",\n \"sec-fetch-site\": \"cross-site\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-dest\": \"empty\",\n \"referer\": \"https://app.tralo.app/\",\n \"accept-encoding\": \"gzip, deflate, br, zstd\",\n \"accept-language\": \"en-US,en;q=0.9\"\n }\n },\n \"response\": {\n \"status\": 200,\n \"content\": {\n \"mimeType\": \"application/json\",\n \"text\": \"{\\\"success\\\":true}\"\n }\n }\n}","results":{"c1":[0.0,0.0,66.7,0.0,0.0,0.0,0.0],"c2a":[0.0,0.0,100.0,0.0,0.0,100.0,0.0],"c2b":[0.0,100.0,100.0,100.0,0.0,100.0,0.0]},"fails":{"c1":[1,1,1,1,3,1,3],"c2a":[3,1,-1,3,3,-1,3],"c2b":[3,-1,-1,-1,3,-1,3]}}],"result_settings":["beam-low","beam-medium","beam-high","gpt-oss-120b-low","gpt-oss-120b-medium","gpt-oss-120b-high","qwen3.5-397b-thinking"],"fail_kinds":["timeout","bad request 400","not found 404","exception","auth 401","precondition 428","return mismatch","no code","no submit","incomplete list","rate limited 429","state mismatch","moved 308"]}