From palantir-pack
Diagnose and fix Palantir Foundry API errors (401/403, ObjectTypeNotFound, DatasetNotFound) and transform failures (AnalysisException, OutOfMemory) with copy-paste Python solutions.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin palantir-packThis skill is limited to using the following tools:
Quick reference for the top 10 most common Foundry API and transform errors with copy-paste solutions.
Executes Palantir Foundry incident response: triage with API health checks, severity classification, mitigation playbooks for auth/rate-limit/build failures.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
Quick reference for the top 10 most common Foundry API and transform errors with copy-paste solutions.
foundry-platform-sdk installedfoundry.ApiError: 401 Unauthorized — The provided token is invalid or expired.
Fix:
# Regenerate token in Developer Console
# Settings > Tokens > Generate new personal access token
# Or re-authenticate with OAuth2:
auth = foundry.ConfidentialClientAuth(
client_id=os.environ["FOUNDRY_CLIENT_ID"],
client_secret=os.environ["FOUNDRY_CLIENT_SECRET"],
hostname=os.environ["FOUNDRY_HOSTNAME"],
scopes=["api:read-data"],
)
auth.sign_in_as_service_user() # Gets a fresh token
foundry.ApiError: 403 Forbidden — Missing required scope: api:ontology-read
Fix: Add missing scopes in Developer Console > Your App > Scopes. Common scopes:
api:read-data — read datasetsapi:write-data — write datasetsapi:ontology-read — read Ontology objectsapi:ontology-write — apply actionsfoundry.ApiError: 404 ObjectTypeNotFound — Object type 'employee' not found
Fix: Object type names are camelCase API names, not display names. Check Ontology Manager:
# List all object types to find the correct api_name
for ot in client.ontologies.ObjectType.list(ontology="my-company"):
print(f" {ot.api_name} (display: {ot.display_name})")
foundry.ApiError: 404 DatasetNotFound — Dataset not found or you do not have access
Fix: Verify the dataset RID (right-click dataset in Foundry UI > Copy RID). Ensure your service user has Viewer/Editor role on the project.
pyspark.sql.utils.AnalysisException: cannot resolve 'fullname' given columns [fullName, department]
Fix: Spark column names are case-sensitive. Print columns to debug:
@transform_df(Output("/out"), data=Input("/in"))
def my_transform(data):
print(data.columns) # Check actual column names
return data.select("fullName") # Use exact casing
java.lang.OutOfMemoryError: Java heap space
Fix: Add @configure with a larger memory profile:
from transforms.api import configure
@configure(profile=["DRIVER_MEMORY_LARGE"]) # 16GB
@transform_df(Output("/out"), data=Input("/in"))
def heavy_transform(data):
return data.groupBy("region").agg({"amount": "sum"})
foundry.ApiError: ActionValidationFailed — Parameter 'salary' must be positive
Fix: Read the validation messages for specific constraint violations:
result = client.ontologies.Action.apply(
ontology="my-company",
action_type="updateSalary",
parameters={"employeeId": "EMP-001", "salary": 150000},
)
if result.validation != "VALID":
for msg in result.validation_messages:
print(f" Validation error: {msg}")
requests.exceptions.SSLError: SSL certificate verify failed
Fix: Common behind corporate proxies. Set the CA bundle:
export REQUESTS_CA_BUNDLE=/path/to/corporate-ca-bundle.crt
# Or for development only (NOT production):
export FOUNDRY_SSL_VERIFY=false
foundry.ApiError: 429 Too Many Requests — Rate limit exceeded
Fix: See palantir-rate-limits for full implementation. Quick fix:
import time
time.sleep(int(response.headers.get("Retry-After", 5)))
Build failed: Circular dependency detected between datasets
Fix: Dataset A's transform reads from B, and B reads from A. Break the cycle by introducing an intermediate dataset or restructuring the pipeline DAG.
| HTTP Code | Meaning | Retryable |
|---|---|---|
| 400 | Bad Request (invalid params) | No — fix request |
| 401 | Token expired/invalid | No — re-authenticate |
| 403 | Missing scopes | No — update app scopes |
| 404 | Resource not found | No — fix identifier |
| 429 | Rate limited | Yes — wait and retry |
| 500/502/503 | Server error | Yes — retry with backoff |
For deeper debugging, see palantir-debug-bundle.