> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usealmanac.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Upload and follow jobs with Python

> Upload individual source files, wait for ingest, and inspect job outcomes.

## Upload files

```python theme={"theme":{"light":"github-light","dark":"vesper"}}
from almanac import AlmanacClient

wiki = AlmanacClient().wiki("acme/company-handbook")
upload = wiki.sources.upload(
    ["docs/onboarding.md", "docs/escalations.pdf"],
    guidance="prioritize onboarding and escalation paths",
)
```

SDK uploads accept individual file paths. They do not recursively expand folders
or preserve a directory root. Use the [CLI](/cli/overview) for folder discovery.

## Wait only when a job exists

```python theme={"theme":{"light":"github-light","dark":"vesper"}}
if upload.job:
    job = wiki.jobs.wait(upload.job.job_id)
    events = wiki.jobs.events(job.job_id)
    outcome = wiki.jobs.outcome(job.job_id)
```

A duplicate-only upload can return no job.

## Garden the wiki

```python theme={"theme":{"light":"github-light","dark":"vesper"}}
job = wiki.garden(guidance="tighten stale onboarding pages")
job = wiki.jobs.wait(job.job_id)
```

The SDK gardens the whole wiki. Use the CLI or REST API for page-scoped Garden.
See [Uploads and jobs](/concepts/uploads-and-jobs) for lifecycle semantics and
[API keys](/api/authentication) for write permissions.
