{"templateId":"api_docs","sharedDataIds":{"apiDocsStore":"api-docs-apis/public-api.yaml","sidebar":"sidebar-sidebars.yaml"},"props":{"definitionId":"apis/public-api.yaml","settings":{"baseUrlPath":"/apis/public-api"},"disableAutoScroll":true,"seo":{"title":"Pioneer Loan Platform API","llmstxt":{"hide":true}},"dynamicMarkdocComponents":[],"metadata":{"type":"openapi","title":"Pioneer Loan Platform API","version":"1.0.0","description":"# Pioneer Public API\n\nThe Pioneer API allows third-party systems to programmatically access loan data,\ndocuments, and related entities.\n\n## URL Structure\n\nAPI requests use environment-specific domains (following existing portal pattern):\n\n```\nProduction:  https://{api-portal}.{bank-domain}/api/public/v1/{resource}\nStaging:     https://{api-portal}.staging.{bank-domain}/api/public/v1/{resource}\n```\n\n- **Production**: `https://api.pioneerft.com/api/public/v1/...` (use `pk_live_*` keys)\n- **Staging**: `https://api.staging.pioneerft.com/api/public/v1/...` (use `pk_test_*` keys)\n\n## Versioning\n\nThe current version is **v1**, served under the `/api/public/v1` path prefix.\nThe legacy unversioned path `/api/public/...` still works but is **deprecated**:\nresponses include `Deprecation: true` and a `Sunset` header. Migrate to\n`/api/public/v1`.\n\n## Authentication\n\nAll API requests require authentication using an API key. Include your API key\nin the `Authorization` header:\n\n```\nAuthorization: Bearer pk_live_your_api_key_here\n```\n\n**Key Types:**\n- `pk_test_*` - Test keys (only work on staging URLs)\n- `pk_live_*` - Live keys (only work on production URLs - no env prefix)\n\nAPI keys can be generated in the Pioneer dashboard under Organization Settings.\nNote: Production keys require explicit approval from Pioneer.\n\n## Rate Limiting\n\nRate limits are applied per API key, with separate budgets for reads and writes:\n\n- **Reads** (GET): **100 requests per minute** per API key.\n- **Writes** (POST/PATCH/DELETE): **30 requests per minute** per API key.\n\nRate limit information is included in response headers:\n\n- `X-RateLimit-Limit`: Maximum requests per window\n- `X-RateLimit-Remaining`: Requests remaining in current window\n- `X-RateLimit-Reset`: Unix timestamp when window resets\n\nWhen rate limited, you'll receive a `429 Too Many Requests` response with\na `Retry-After` header indicating seconds to wait.\n\n**⚠️ Important:** Production API keys (`pk_live_*`) that exceed rate limits\n3 or more times within 24 hours will be automatically revoked, and your\norganization's production API access will be disabled. Contact Pioneer\nsupport to re-enable access.\n\n## Idempotency\n\nWrite requests (POST/PATCH/DELETE) accept an optional `Idempotency-Key` header\n(any opaque string up to 255 chars; a UUID is recommended). Replaying a request\nwith the same key returns the original response instead of repeating the side\neffect.\n\n## Pagination\n\nList endpoints support pagination via query parameters:\n\n- `limit`: Number of items to return (default: 50, max: 100)\n- `offset`: Number of items to skip\n\nResponse includes pagination metadata. Offset-mode responses look like:\n\n```json\n{\n  \"data\": [],\n  \"meta\": {\n    \"mode\": \"offset\",\n    \"limit\": 50,\n    \"offset\": 0,\n    \"hasMore\": true\n  }\n}\n```\n\nCursor-mode responses (returned when a `cursor` query param is supplied) instead\ncontain `{ \"mode\": \"cursor\", \"limit\": 50, \"hasMore\": true, \"nextCursor\": \"<token>\" }`,\nwhere `nextCursor` is an opaque token (null when there are no more results). Pass\nit back as the `cursor` query param to fetch the next page. Offset and cursor are\nmutually exclusive, and cursor mode always orders by creation time.\n\n## Errors\n\nErrors are returned with appropriate HTTP status codes and JSON body:\n\n```json\n{\n  \"code\": \"auth.invalid_key\",\n  \"message\": \"Invalid or expired API key\"\n}\n```\n\nCommon error codes:\n- `auth.invalid_key`: API key is invalid or expired\n- `auth.org_mismatch`: API key does not belong to the organization in the URL\n- `auth.env_mismatch`: API key type does not match URL environment\n- `auth.env_not_available`: Environment not available for this organization\n- `auth.insufficient_permissions`: API key lacks required permission\n- `auth.country_restricted`: Request IP not allowed for this API key\n- `api_key.production_not_allowed`: Organization not approved for production API keys\n- `input.invalid`: Request validation failed\n- `rate_limit.exceeded`: Too many requests\n\n## OpenAPI document\n\nThe spec is published in two OpenAPI versions, both under _Download OpenAPI\ndescription_ and each in YAML and JSON. They are generated from the same routes\nin the same run, describe the identical API, and differ only in schema dialect.\n\n**OpenAPI 3.1.0** is the current one. It uses JSON Schema 2020-12:\n`type: [..., \"null\"]` for nullables and numeric\n`exclusiveMinimum`/`exclusiveMaximum`.\n\n**OpenAPI 3.0.3** is for tooling that does not read 3.1 — the same document with\n`nullable: true` and boolean `exclusive*` instead. It is also what the Postman\ncollection is generated from. 3.0.3 is the last patch of the 3.0 line; a\nconsumer pinned to 3.0.0, 3.0.1 or 3.0.2 reads it without changes, since those\npatches clarify the specification rather than alter the document format.\n\nIf your generator supports both, take 3.1.0.\n\n## API clients\n\nReady-to-import clients are generated from these same routes in the same run, so\nthey never drift from the live API. Both are listed under _Download OpenAPI\ndescription_ above, next to the spec itself.\n\n**Postman.** Import the collection plus the environment for your target\n(Staging or Production), then set `apiKey` to your key — every request inherits\ncollection-level bearer auth. Path parameters such as `:id` appear as editable\nfields under the URL bar, and optional query parameters are pre-filled but\ndisabled, so tick only the ones you need.\n\n**Insomnia.** Imports OpenAPI directly: **Import** -> **File** -> choose the\nOpenAPI 3.0.3 YAML. Set the base environment's `base_url` to the environment you\nare targeting and add your key as a bearer token.\n\nNeed access or a key? [Contact us](https://www.pioneerft.com)."},"compilationErrors":[],"markdown":{"partials":{},"variables":{"rbac":{"teams":["anonymous"]},"user":{},"remoteAddr":{"hostname":"docs.pioneerft.com","port":4000,"ipAddress":"216.73.217.116"},"lang":"default_locale","env":{"PUBLIC_REDOCLY_BRANCH_NAME":"main"}}},"pagePropGetterError":{"message":"","name":""}},"slug":"/apis/public-api","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}