> For the complete documentation index, see [llms.txt](https://docs.nexusglobalpayments.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.nexusglobalpayments.org/apis/fxp-psp-relationships.md).

# FXP PSP Relationships

FXP will use the following APIs to list, add, update or delete business relationships with PSPs and set any price improvement (in bps) for a particular PSP.

## List PSP relationships for an FXP

> Returns all PSP relationships for the given FXP, including the configured PSP-based improvement (if any) for each PSP. Results are cursor-paginated.

```json
{"openapi":"3.1.0","info":{"title":"Nexus API","version":"v1"},"tags":[{"name":"FXP PSP Relationships","description":"Manage FXP–PSP business relationships and optional PSP-based rate improvements expressed in basis points. A relationship must exist for the FXP to be eligible to provide quotes to a PSP. The PSP-based improvement applies to all currencies for that PSP."}],"servers":[{"url":"http://localhost:8080","description":"Local simulator (make run / make docker-run)"},{"url":"https://nexus-ai-simulator-683365449922.asia-southeast1.run.app","description":"Deployed simulator (Cloud Run, asia-southeast1) - indicative, not authoritative"}],"security":[{"nexusClientCert":[],"nexusOAuth":["relationships.read"]}],"components":{"securitySchemes":{"nexusClientCert":{"type":"mutualTLS","description":"Nexus issued X.509 client certificate presented during the TLS handshake and validated at the Akamai global edge. The FXP generates its own key pair and submits a CSR during onboarding; Vault PKI (edge intermediate CA) signs it and the private key never leaves FXP infrastructure. Fail closed: a missing, expired, revoked or untrusted certificate causes the TLS handshake to fail at the edge and no HTTP response is produced. The certificate is not forwarded to the origin as an HTTP header."}},"schemas":{"RelationshipsPageResponse":{"type":"object","description":"Paginated list of FXP–PSP relationship records.","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/RelationshipResponse"},"description":"Relationship records for the current page."},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page. Null if this is the last page."}}},"RelationshipResponse":{"type":"object","description":"A single FXP–PSP relationship record.","properties":{"relationshipId":{"type":"string","format":"uuid","description":"Nexus-assigned unique identifier for this relationship record."},"fxpId":{"type":"string","description":"Nexus internal identifier for the FXP."},"pspId":{"type":"string","description":"Nexus internal identifier for the PSP."},"pspImprovementBps":{"type":["integer","null"],"description":"PSP-based improvement in basis points. Null if no improvement is configured."},"createdDateTime":{"type":"string","format":"date-time","description":"ISO 8601 UTC timestamp when this relationship was created."},"updatedDateTime":{"type":["string","null"],"format":"date-time","description":"ISO 8601 UTC timestamp of the last update. Null if never updated."}}},"ErrorApiResponse":{"type":"object","description":"Standard structured rejection body. Returned for all non-2xx responses produced by the auth sidecar or the application. Gateway level errors (405, 409, 413, 429, 502, 503, 504) do NOT carry this body.","properties":{"statusCode":{"type":"string","description":"Business-level status code. Always RJCT (Rejected) — the structured error body is only returned for rejection cases. Successful responses use HTTP status alone (200 OK for sync, 202 Accepted for async ingress) with no structured statusCode body.","enum":["RJCT"],"maxLength":4},"reasonCode":{"type":"string","description":"Categorised reason code. Three families: TE (Technical Error, e.g. TE001/TE002/TE099), AE (Authentication / Authorization Error, e.g. AE001–AE004, sidecar-enforced), BE (Business Error). BE001–BE020 are raised by the Payments endpoints; BE021–BE027 are raised by the FXP endpoints.","enum":["AE001","AE002","AE003","AE004","BE001","BE002","BE005","BE006","BE007","BE008","BE009","BE011","BE012","BE016","BE017","BE018","BE019","BE020","BE021","BE022","BE023","BE024","BE025","BE026","BE027","TE001","TE002","TE099"],"maxLength":5,"pattern":"[A-Z]{2}[0-9]{3}"},"name":{"type":"string","description":"Machine-readable business error name from the reason code catalogue.","maxLength":50,"pattern":"[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*"},"description":{"type":"string","description":"Human-readable error description. MUST NOT contain PII (CD-INV-09).","maxLength":500}},"required":["description","name","reasonCode","statusCode"]}}},"paths":{"/v1/relationships/fxps/{fxpId}/psps":{"get":{"tags":["FXP PSP Relationships"],"summary":"List PSP relationships for an FXP","description":"Returns all PSP relationships for the given FXP, including the configured PSP-based improvement (if any) for each PSP. Results are cursor-paginated.","operationId":"listFxpPspRelationships","parameters":[{"name":"Accept","in":"header","description":"application/json","required":true,"schema":{"type":"string","default":"application/json"}},{"name":"fxpId","in":"path","description":"Nexus internal identifier for the FXP.","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max items to return. Default 50.","required":false,"schema":{"type":"integer","default":50,"minimum":1}},{"name":"cursor","in":"query","description":"Pagination cursor; omit for first page.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relationships retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipsPageResponse"}}}},"400":{"description":"Invalid Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"401":{"description":"Authentication Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"403":{"description":"Authorization Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"404":{"description":"FXP Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"405":{"description":"Method Not Allowed. The HTTP method is not supported for this endpoint. Use the correct HTTP method.","headers":{"Allow":{"description":"Permitted HTTP methods for this endpoint","schema":{"type":"string"}}}},"429":{"description":"Too Many Requests. Rate limit exceeded. The Retry-After header indicates when to retry. Back off and retry after the indicated duration.","headers":{"Retry-After":{"description":"Duration after which the caller may retry","schema":{"type":"integer","minimum":0,"description":"Number of seconds to wait before retrying"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"502":{"description":"Bad Gateway. The gateway received an invalid response from the upstream service. Retry with exponential backoff. If persistent, escalate."},"503":{"description":"Service Unavailable. The upstream service is temporarily unavailable, for example during rolling deployment. Retry with exponential backoff."},"504":{"description":"Gateway Timeout. The upstream service did not respond within the gateway's timeout window. Retry with exponential backoff."}}}}}}
```

## Get a single FXP–PSP relationship

> Returns a single FXP–PSP relationship, including the PSP-based improvement (if configured).

```json
{"openapi":"3.1.0","info":{"title":"Nexus API","version":"v1"},"tags":[{"name":"FXP PSP Relationships","description":"Manage FXP–PSP business relationships and optional PSP-based rate improvements expressed in basis points. A relationship must exist for the FXP to be eligible to provide quotes to a PSP. The PSP-based improvement applies to all currencies for that PSP."}],"servers":[{"url":"http://localhost:8080","description":"Local simulator (make run / make docker-run)"},{"url":"https://nexus-ai-simulator-683365449922.asia-southeast1.run.app","description":"Deployed simulator (Cloud Run, asia-southeast1) - indicative, not authoritative"}],"security":[{"nexusClientCert":[],"nexusOAuth":["relationships.read"]}],"components":{"securitySchemes":{"nexusClientCert":{"type":"mutualTLS","description":"Nexus issued X.509 client certificate presented during the TLS handshake and validated at the Akamai global edge. The FXP generates its own key pair and submits a CSR during onboarding; Vault PKI (edge intermediate CA) signs it and the private key never leaves FXP infrastructure. Fail closed: a missing, expired, revoked or untrusted certificate causes the TLS handshake to fail at the edge and no HTTP response is produced. The certificate is not forwarded to the origin as an HTTP header."}},"schemas":{"RelationshipResponse":{"type":"object","description":"A single FXP–PSP relationship record.","properties":{"relationshipId":{"type":"string","format":"uuid","description":"Nexus-assigned unique identifier for this relationship record."},"fxpId":{"type":"string","description":"Nexus internal identifier for the FXP."},"pspId":{"type":"string","description":"Nexus internal identifier for the PSP."},"pspImprovementBps":{"type":["integer","null"],"description":"PSP-based improvement in basis points. Null if no improvement is configured."},"createdDateTime":{"type":"string","format":"date-time","description":"ISO 8601 UTC timestamp when this relationship was created."},"updatedDateTime":{"type":["string","null"],"format":"date-time","description":"ISO 8601 UTC timestamp of the last update. Null if never updated."}}},"ErrorApiResponse":{"type":"object","description":"Standard structured rejection body. Returned for all non-2xx responses produced by the auth sidecar or the application. Gateway level errors (405, 409, 413, 429, 502, 503, 504) do NOT carry this body.","properties":{"statusCode":{"type":"string","description":"Business-level status code. Always RJCT (Rejected) — the structured error body is only returned for rejection cases. Successful responses use HTTP status alone (200 OK for sync, 202 Accepted for async ingress) with no structured statusCode body.","enum":["RJCT"],"maxLength":4},"reasonCode":{"type":"string","description":"Categorised reason code. Three families: TE (Technical Error, e.g. TE001/TE002/TE099), AE (Authentication / Authorization Error, e.g. AE001–AE004, sidecar-enforced), BE (Business Error). BE001–BE020 are raised by the Payments endpoints; BE021–BE027 are raised by the FXP endpoints.","enum":["AE001","AE002","AE003","AE004","BE001","BE002","BE005","BE006","BE007","BE008","BE009","BE011","BE012","BE016","BE017","BE018","BE019","BE020","BE021","BE022","BE023","BE024","BE025","BE026","BE027","TE001","TE002","TE099"],"maxLength":5,"pattern":"[A-Z]{2}[0-9]{3}"},"name":{"type":"string","description":"Machine-readable business error name from the reason code catalogue.","maxLength":50,"pattern":"[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*"},"description":{"type":"string","description":"Human-readable error description. MUST NOT contain PII (CD-INV-09).","maxLength":500}},"required":["description","name","reasonCode","statusCode"]}}},"paths":{"/v1/relationships/fxps/{fxpId}/psps/{pspId}":{"get":{"tags":["FXP PSP Relationships"],"summary":"Get a single FXP–PSP relationship","description":"Returns a single FXP–PSP relationship, including the PSP-based improvement (if configured).","operationId":"getFxpPspRelationship","parameters":[{"name":"Accept","in":"header","description":"application/json","required":true,"schema":{"type":"string","default":"application/json"}},{"name":"fxpId","in":"path","description":"Nexus internal identifier for the FXP.","required":true,"schema":{"type":"string"}},{"name":"pspId","in":"path","description":"Nexus internal identifier for the PSP.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relationship retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipResponse"}}}},"400":{"description":"Invalid Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"401":{"description":"Authentication Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"403":{"description":"Authorization Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"404":{"description":"Relationship Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"405":{"description":"Method Not Allowed. The HTTP method is not supported for this endpoint. Use the correct HTTP method.","headers":{"Allow":{"description":"Permitted HTTP methods for this endpoint","schema":{"type":"string"}}}},"429":{"description":"Too Many Requests. Rate limit exceeded. The Retry-After header indicates when to retry. Back off and retry after the indicated duration.","headers":{"Retry-After":{"description":"Duration after which the caller may retry","schema":{"type":"integer","minimum":0,"description":"Number of seconds to wait before retrying"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"502":{"description":"Bad Gateway. The gateway received an invalid response from the upstream service. Retry with exponential backoff. If persistent, escalate."},"503":{"description":"Service Unavailable. The upstream service is temporarily unavailable, for example during rolling deployment. Retry with exponential backoff."},"504":{"description":"Gateway Timeout. The upstream service did not respond within the gateway's timeout window. Retry with exponential backoff."}}}}}}
```

## Create an FXP–PSP relationship

> Creates an FXP–PSP relationship, recording that the FXP is eligible to provide FX quotes to the specified PSP. Optionally configures a PSP-based improvement in basis points. The improvement applies to all currencies for this PSP.

```json
{"openapi":"3.1.0","info":{"title":"Nexus API","version":"v1"},"tags":[{"name":"FXP PSP Relationships","description":"Manage FXP–PSP business relationships and optional PSP-based rate improvements expressed in basis points. A relationship must exist for the FXP to be eligible to provide quotes to a PSP. The PSP-based improvement applies to all currencies for that PSP."}],"servers":[{"url":"http://localhost:8080","description":"Local simulator (make run / make docker-run)"},{"url":"https://nexus-ai-simulator-683365449922.asia-southeast1.run.app","description":"Deployed simulator (Cloud Run, asia-southeast1) - indicative, not authoritative"}],"security":[{"nexusClientCert":[],"nexusOAuth":["relationships.write"]}],"components":{"securitySchemes":{"nexusClientCert":{"type":"mutualTLS","description":"Nexus issued X.509 client certificate presented during the TLS handshake and validated at the Akamai global edge. The FXP generates its own key pair and submits a CSR during onboarding; Vault PKI (edge intermediate CA) signs it and the private key never leaves FXP infrastructure. Fail closed: a missing, expired, revoked or untrusted certificate causes the TLS handshake to fail at the edge and no HTTP response is produced. The certificate is not forwarded to the origin as an HTTP header."}},"schemas":{"RelationshipRequest":{"type":"object","description":"Request body for creating an FXP–PSP relationship. pspImprovementBps is optional.","properties":{"pspImprovementBps":{"type":["integer","null"],"minimum":0,"description":"PSP-based improvement in basis points. Omit to apply the FXP base rate without improvement to this PSP."}}},"RelationshipResponse":{"type":"object","description":"A single FXP–PSP relationship record.","properties":{"relationshipId":{"type":"string","format":"uuid","description":"Nexus-assigned unique identifier for this relationship record."},"fxpId":{"type":"string","description":"Nexus internal identifier for the FXP."},"pspId":{"type":"string","description":"Nexus internal identifier for the PSP."},"pspImprovementBps":{"type":["integer","null"],"description":"PSP-based improvement in basis points. Null if no improvement is configured."},"createdDateTime":{"type":"string","format":"date-time","description":"ISO 8601 UTC timestamp when this relationship was created."},"updatedDateTime":{"type":["string","null"],"format":"date-time","description":"ISO 8601 UTC timestamp of the last update. Null if never updated."}}},"ErrorApiResponse":{"type":"object","description":"Standard structured rejection body. Returned for all non-2xx responses produced by the auth sidecar or the application. Gateway level errors (405, 409, 413, 429, 502, 503, 504) do NOT carry this body.","properties":{"statusCode":{"type":"string","description":"Business-level status code. Always RJCT (Rejected) — the structured error body is only returned for rejection cases. Successful responses use HTTP status alone (200 OK for sync, 202 Accepted for async ingress) with no structured statusCode body.","enum":["RJCT"],"maxLength":4},"reasonCode":{"type":"string","description":"Categorised reason code. Three families: TE (Technical Error, e.g. TE001/TE002/TE099), AE (Authentication / Authorization Error, e.g. AE001–AE004, sidecar-enforced), BE (Business Error). BE001–BE020 are raised by the Payments endpoints; BE021–BE027 are raised by the FXP endpoints.","enum":["AE001","AE002","AE003","AE004","BE001","BE002","BE005","BE006","BE007","BE008","BE009","BE011","BE012","BE016","BE017","BE018","BE019","BE020","BE021","BE022","BE023","BE024","BE025","BE026","BE027","TE001","TE002","TE099"],"maxLength":5,"pattern":"[A-Z]{2}[0-9]{3}"},"name":{"type":"string","description":"Machine-readable business error name from the reason code catalogue.","maxLength":50,"pattern":"[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*"},"description":{"type":"string","description":"Human-readable error description. MUST NOT contain PII (CD-INV-09).","maxLength":500}},"required":["description","name","reasonCode","statusCode"]}}},"paths":{"/v1/relationships/fxps/{fxpId}/psps/{pspId}":{"post":{"tags":["FXP PSP Relationships"],"summary":"Create an FXP–PSP relationship","description":"Creates an FXP–PSP relationship, recording that the FXP is eligible to provide FX quotes to the specified PSP. Optionally configures a PSP-based improvement in basis points. The improvement applies to all currencies for this PSP.","operationId":"createFxpPspRelationship","parameters":[{"name":"Accept","in":"header","description":"application/json","required":true,"schema":{"type":"string","default":"application/json"}},{"name":"fxpId","in":"path","description":"Nexus internal identifier for the FXP.","required":true,"schema":{"type":"string"}},{"name":"pspId","in":"path","description":"Nexus internal identifier for the PSP.","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Relationship creation request. pspImprovementBps is optional; omit to apply the FXP's base rate to this PSP.","required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipRequest"}}}},"responses":{"200":{"description":"Relationship created successfully. Returns the new relationship record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipResponse"}}}},"400":{"description":"Invalid Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"401":{"description":"Authentication Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"403":{"description":"Authorization Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"405":{"description":"Method Not Allowed. The HTTP method is not supported for this endpoint. Use the correct HTTP method.","headers":{"Allow":{"description":"Permitted HTTP methods for this endpoint","schema":{"type":"string"}}}},"409":{"description":"Conflict. A relationship already exists for this FXP and PSP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"429":{"description":"Too Many Requests. Rate limit exceeded. The Retry-After header indicates when to retry. Back off and retry after the indicated duration.","headers":{"Retry-After":{"description":"Duration after which the caller may retry","schema":{"type":"integer","minimum":0,"description":"Number of seconds to wait before retrying"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"502":{"description":"Bad Gateway. The gateway received an invalid response from the upstream service. Retry with exponential backoff. If persistent, escalate."},"503":{"description":"Service Unavailable. The upstream service is temporarily unavailable, for example during rolling deployment. Retry with exponential backoff."},"504":{"description":"Gateway Timeout. The upstream service did not respond within the gateway's timeout window. Retry with exponential backoff."}}}}}}
```

## Update an FXP–PSP relationship

> Updates an existing FXP–PSP relationship. Replaces the configured PSP-based improvement in basis points. Set pspImprovementBps to 0 to remove the improvement so the FXP's base rate applies.

```json
{"openapi":"3.1.0","info":{"title":"Nexus API","version":"v1"},"tags":[{"name":"FXP PSP Relationships","description":"Manage FXP–PSP business relationships and optional PSP-based rate improvements expressed in basis points. A relationship must exist for the FXP to be eligible to provide quotes to a PSP. The PSP-based improvement applies to all currencies for that PSP."}],"servers":[{"url":"http://localhost:8080","description":"Local simulator (make run / make docker-run)"},{"url":"https://nexus-ai-simulator-683365449922.asia-southeast1.run.app","description":"Deployed simulator (Cloud Run, asia-southeast1) - indicative, not authoritative"}],"security":[{"nexusClientCert":[],"nexusOAuth":["relationships.write"]}],"components":{"securitySchemes":{"nexusClientCert":{"type":"mutualTLS","description":"Nexus issued X.509 client certificate presented during the TLS handshake and validated at the Akamai global edge. The FXP generates its own key pair and submits a CSR during onboarding; Vault PKI (edge intermediate CA) signs it and the private key never leaves FXP infrastructure. Fail closed: a missing, expired, revoked or untrusted certificate causes the TLS handshake to fail at the edge and no HTTP response is produced. The certificate is not forwarded to the origin as an HTTP header."}},"schemas":{"RelationshipUpdateRequest":{"type":"object","required":["pspImprovementBps"],"description":"Request body for updating an FXP–PSP relationship improvement.","properties":{"pspImprovementBps":{"type":"integer","minimum":0,"description":"Updated PSP-based improvement in basis points. Set to 0 to remove the improvement so the base rate applies."}}},"RelationshipResponse":{"type":"object","description":"A single FXP–PSP relationship record.","properties":{"relationshipId":{"type":"string","format":"uuid","description":"Nexus-assigned unique identifier for this relationship record."},"fxpId":{"type":"string","description":"Nexus internal identifier for the FXP."},"pspId":{"type":"string","description":"Nexus internal identifier for the PSP."},"pspImprovementBps":{"type":["integer","null"],"description":"PSP-based improvement in basis points. Null if no improvement is configured."},"createdDateTime":{"type":"string","format":"date-time","description":"ISO 8601 UTC timestamp when this relationship was created."},"updatedDateTime":{"type":["string","null"],"format":"date-time","description":"ISO 8601 UTC timestamp of the last update. Null if never updated."}}},"ErrorApiResponse":{"type":"object","description":"Standard structured rejection body. Returned for all non-2xx responses produced by the auth sidecar or the application. Gateway level errors (405, 409, 413, 429, 502, 503, 504) do NOT carry this body.","properties":{"statusCode":{"type":"string","description":"Business-level status code. Always RJCT (Rejected) — the structured error body is only returned for rejection cases. Successful responses use HTTP status alone (200 OK for sync, 202 Accepted for async ingress) with no structured statusCode body.","enum":["RJCT"],"maxLength":4},"reasonCode":{"type":"string","description":"Categorised reason code. Three families: TE (Technical Error, e.g. TE001/TE002/TE099), AE (Authentication / Authorization Error, e.g. AE001–AE004, sidecar-enforced), BE (Business Error). BE001–BE020 are raised by the Payments endpoints; BE021–BE027 are raised by the FXP endpoints.","enum":["AE001","AE002","AE003","AE004","BE001","BE002","BE005","BE006","BE007","BE008","BE009","BE011","BE012","BE016","BE017","BE018","BE019","BE020","BE021","BE022","BE023","BE024","BE025","BE026","BE027","TE001","TE002","TE099"],"maxLength":5,"pattern":"[A-Z]{2}[0-9]{3}"},"name":{"type":"string","description":"Machine-readable business error name from the reason code catalogue.","maxLength":50,"pattern":"[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*"},"description":{"type":"string","description":"Human-readable error description. MUST NOT contain PII (CD-INV-09).","maxLength":500}},"required":["description","name","reasonCode","statusCode"]}}},"paths":{"/v1/relationships/fxps/{fxpId}/psps/{pspId}":{"put":{"tags":["FXP PSP Relationships"],"summary":"Update an FXP–PSP relationship","description":"Updates an existing FXP–PSP relationship. Replaces the configured PSP-based improvement in basis points. Set pspImprovementBps to 0 to remove the improvement so the FXP's base rate applies.","operationId":"updateFxpPspRelationship","parameters":[{"name":"Accept","in":"header","description":"application/json","required":true,"schema":{"type":"string","default":"application/json"}},{"name":"fxpId","in":"path","description":"Nexus internal identifier for the FXP.","required":true,"schema":{"type":"string"}},{"name":"pspId","in":"path","description":"Nexus internal identifier for the PSP.","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Relationship update request.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipUpdateRequest"}}}},"responses":{"200":{"description":"Relationship updated successfully. Returns the updated relationship record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipResponse"}}}},"400":{"description":"Invalid Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"401":{"description":"Authentication Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"403":{"description":"Authorization Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"404":{"description":"Relationship Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"405":{"description":"Method Not Allowed. The HTTP method is not supported for this endpoint. Use the correct HTTP method.","headers":{"Allow":{"description":"Permitted HTTP methods for this endpoint","schema":{"type":"string"}}}},"429":{"description":"Too Many Requests. Rate limit exceeded. The Retry-After header indicates when to retry. Back off and retry after the indicated duration.","headers":{"Retry-After":{"description":"Duration after which the caller may retry","schema":{"type":"integer","minimum":0,"description":"Number of seconds to wait before retrying"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"502":{"description":"Bad Gateway. The gateway received an invalid response from the upstream service. Retry with exponential backoff. If persistent, escalate."},"503":{"description":"Service Unavailable. The upstream service is temporarily unavailable, for example during rolling deployment. Retry with exponential backoff."},"504":{"description":"Gateway Timeout. The upstream service did not respond within the gateway's timeout window. Retry with exponential backoff."}}}}}}
```

## Delete an FXP–PSP relationship

> Deletes the FXP–PSP relationship so the FXP is no longer eligible to provide quotes to that PSP. Returns 204 No Content on success.

```json
{"openapi":"3.1.0","info":{"title":"Nexus API","version":"v1"},"tags":[{"name":"FXP PSP Relationships","description":"Manage FXP–PSP business relationships and optional PSP-based rate improvements expressed in basis points. A relationship must exist for the FXP to be eligible to provide quotes to a PSP. The PSP-based improvement applies to all currencies for that PSP."}],"servers":[{"url":"http://localhost:8080","description":"Local simulator (make run / make docker-run)"},{"url":"https://nexus-ai-simulator-683365449922.asia-southeast1.run.app","description":"Deployed simulator (Cloud Run, asia-southeast1) - indicative, not authoritative"}],"security":[{"nexusClientCert":[],"nexusOAuth":["relationships.write"]}],"components":{"securitySchemes":{"nexusClientCert":{"type":"mutualTLS","description":"Nexus issued X.509 client certificate presented during the TLS handshake and validated at the Akamai global edge. The FXP generates its own key pair and submits a CSR during onboarding; Vault PKI (edge intermediate CA) signs it and the private key never leaves FXP infrastructure. Fail closed: a missing, expired, revoked or untrusted certificate causes the TLS handshake to fail at the edge and no HTTP response is produced. The certificate is not forwarded to the origin as an HTTP header."}},"schemas":{"ErrorApiResponse":{"type":"object","description":"Standard structured rejection body. Returned for all non-2xx responses produced by the auth sidecar or the application. Gateway level errors (405, 409, 413, 429, 502, 503, 504) do NOT carry this body.","properties":{"statusCode":{"type":"string","description":"Business-level status code. Always RJCT (Rejected) — the structured error body is only returned for rejection cases. Successful responses use HTTP status alone (200 OK for sync, 202 Accepted for async ingress) with no structured statusCode body.","enum":["RJCT"],"maxLength":4},"reasonCode":{"type":"string","description":"Categorised reason code. Three families: TE (Technical Error, e.g. TE001/TE002/TE099), AE (Authentication / Authorization Error, e.g. AE001–AE004, sidecar-enforced), BE (Business Error). BE001–BE020 are raised by the Payments endpoints; BE021–BE027 are raised by the FXP endpoints.","enum":["AE001","AE002","AE003","AE004","BE001","BE002","BE005","BE006","BE007","BE008","BE009","BE011","BE012","BE016","BE017","BE018","BE019","BE020","BE021","BE022","BE023","BE024","BE025","BE026","BE027","TE001","TE002","TE099"],"maxLength":5,"pattern":"[A-Z]{2}[0-9]{3}"},"name":{"type":"string","description":"Machine-readable business error name from the reason code catalogue.","maxLength":50,"pattern":"[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*"},"description":{"type":"string","description":"Human-readable error description. MUST NOT contain PII (CD-INV-09).","maxLength":500}},"required":["description","name","reasonCode","statusCode"]}}},"paths":{"/v1/relationships/fxps/{fxpId}/psps/{pspId}":{"delete":{"tags":["FXP PSP Relationships"],"summary":"Delete an FXP–PSP relationship","description":"Deletes the FXP–PSP relationship so the FXP is no longer eligible to provide quotes to that PSP. Returns 204 No Content on success.","operationId":"deleteFxpPspRelationship","parameters":[{"name":"fxpId","in":"path","description":"Nexus internal identifier for the FXP.","required":true,"schema":{"type":"string"}},{"name":"pspId","in":"path","description":"Nexus internal identifier for the PSP.","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Relationship deleted successfully. No content returned."},"400":{"description":"Invalid Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"401":{"description":"Authentication Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"403":{"description":"Authorization Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"404":{"description":"Relationship Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"405":{"description":"Method Not Allowed. The HTTP method is not supported for this endpoint. Use the correct HTTP method.","headers":{"Allow":{"description":"Permitted HTTP methods for this endpoint","schema":{"type":"string"}}}},"429":{"description":"Too Many Requests. Rate limit exceeded. The Retry-After header indicates when to retry. Back off and retry after the indicated duration.","headers":{"Retry-After":{"description":"Duration after which the caller may retry","schema":{"type":"integer","minimum":0,"description":"Number of seconds to wait before retrying"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"502":{"description":"Bad Gateway. The gateway received an invalid response from the upstream service. Retry with exponential backoff. If persistent, escalate."},"503":{"description":"Service Unavailable. The upstream service is temporarily unavailable, for example during rolling deployment. Retry with exponential backoff."},"504":{"description":"Gateway Timeout. The upstream service did not respond within the gateway's timeout window. Retry with exponential backoff."}}}}}}
```
