plures
The official Python client for Plures: human judgment as an API for AI agents. Send a decision to ID verified people and get their consensus back before your agent acts. A human in the loop step you can call like any other API.
pip install plures
Python 3.8+, standard library only.
Use it
from plures import Plures
plures = Plures() # reads PLURES_API_KEY, or Plures("pk_test_...")
task = plures.verify(
"Does the invoice match the order?",
["Matches", "Does not match"],
context="Order: 48 chairs, $4,218. Invoice: 48 chairs plus $180 freight, $4,398.",
verifiers=3,
)
result = task["result"]
if result and result["agreement"] == 1:
print("Act on:", result["answer"])
else:
print("Not unanimous: send to the team")
Get a free test key at plures.si. Test keys complete at once with the first option (or metadata["test_answer"]) and never reach real people. Set metadata["test_outcome"] to split, tie, expired or slow to test the cases you route to your own team.
Production: webhooks
plures.create_task(
"Should this customer get a refund?", ["Approve", "Decline"],
context=ticket_text, webhook_url="https://your.app/plures",
metadata={"order_id": order_id}, idempotency_key="refund-%s" % order_id,
)
# In your webhook handler (Flask shown), pass the raw body exactly as received
from plures import verify_webhook
event = verify_webhook(request.get_data(), request.headers.get("Plures-Signature"), WEBHOOK_SECRET)
API
create_task(question, options, idempotency_key=None, **fields): fields arecontext,image_url,audio_urlorvideo_urlwithmedia_seconds(a clip up to 180 seconds that people play through before answering),sensitive,instructions,verifiers(1, 3, 5, 7 or 9),max_verifiers,presence_check(default True),webhook_url,metadata,expires_inget_task(id),list_tasks(status=None, limit=None, starting_after=None, app=None),cancel_task(id)Plures(app="support-agent")orPLURES_APP: send everything to one of your apps.list_apps(),create_app(name, id=None),get_app(id),update_app(id, name=None, id=None, default=None),delete_app(id).map_guide(),get_map(app),upload_map(app, agent_map),set_checkpoint(app, id, status): the agent map, where your agent needs a person. Or runnpx plures mapin your repo.create_map_key(app, label=None),list_map_keys(app),revoke_map_key(app, key_id): map keys for CI, which can only read and upload that app's map.map_workflow(app, branch="main")returns the GitHub Action that maps on every push.start_map_run(app),list_map_runs(app): a run where Plures runs Claude for CI with no Claude key.github_repos(),connect_github(app, "owner/repo"),turn_on_github(app),github_status(app),disconnect_github(app): Map with GitHub from code. Plures sets the repo's map key secret and opens a pull request adding the workflow;turn_on_githubmerges it. Installing the Plures GitHub App needs a browser once (install_url).sample(rubric, output, input=None): send every output; a share is graded by people, with personal details taken out first.create_rubric(name, question, options, sample_rate=0.05),get_rubric(name)(scores and drift),list_rubrics(),update_rubric(),delete_rubric().compare(release, a, b, input=None)andget_release(release)for blind release checks.export_graded(rubric)for evals or fine tuning.get_routing(),set_routing(team=None, groups=None, rules=None): named teams of your own people and rules by category, likegroups=[{"name": "Finance", "emails": ["ap@acme.com"]}], rules=[{"category": "refunds", "route": "team", "group": "Finance"}]. Send a task withroute="team"to skip verified people ($0.05 per internal vote live), or tag it withcategory=and let the rules decide. A team can vote: setvotes,unanimous,leadandpasskeyon it, orteam_votes=3on a task.set_test_mix({"unanimous": 70, "split": 20, "tie": 5, "expired": 5}),get_test_mix(),clear_test_mix(): with a test key, makes a share of test tasks split, tie or expire at random so you can test routing to your team without changing your agent. A task can override it withmetadata={"test_mix": {...}}, andmetadata.test_outcomebeats both.balance(): your prepaid credit for live tasks, in cents. Live tasks cost $0.20 per answer (more for clips); a task that could cost more than your available credit raisesPluresErrorwithtypeinsufficient_credits(status 402).wait_for(id, timeout=600, interval=3): poll until settledverify(question, options, timeout=600, **fields): create and waitverify_webhook(raw_body, signature_header, secret): check a webhook and return the event
Errors raise PluresError with .status and .type. Server errors are retried twice.
Examples for LangGraph and the OpenAI Agents SDK: github.com/plureslabs/plures. Full reference: plures.si/docs.
Metadata
Release files for plures 1.11.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| plures-1.11.0.tar.gz | 8.4 kB | With provenance | Details for plures-1.11.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| plures-1.11.0-py3-none-any.whl | Python 3 | none | any | Details for plures-1.11.0-py3-none-any.whl |
Total release size: 18.1 kB
Release files / plures-1.11.0.tar.gz
| Download URL | plures-1.11.0.tar.gz |
|---|---|
| Size | 8.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
74c7418878430f7d58271982547fb354d87a079b406d899754b93e2b112ae35b
|
|
BLAKE2b-256 checksum How to use checksums |
c59ab05a682704f9913a4e558212ba73133d23ed32df0d5aa03cefefb5b72b11
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logRelease files / plures-1.11.0-py3-none-any.whl
| Download URL | plures-1.11.0-py3-none-any.whl |
|---|---|
| Size | 9.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e17093e4e334a50cb89cf2a83c8aaec884bad33e15cb1a8a8f9b16f58ceaac9b
|
|
BLAKE2b-256 checksum How to use checksums |
29fedb0ffa7034e8893e2d212b2c559a9b40ba324238e5c519c43ca9a812b819
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logSecurity for plures 1.11.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for plures-1.11.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.