Files
llm-wiki/raw/official-docs/idempotency-paypal-docs.md

108 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: PayPal REST API — Idempotency (PayPal-Request-Id)
source_type: official-doc
url: https://developer.paypal.com/api/rest/reference/idempotency/
archive_url:
status: raw
confidence: medium
tags: [ca-idempotency, paypal, pair-scope, payment-domain]
related_projects: [ca-skeleton-operational-contract]
related_branches: [feature-rate-limit-idempotency-contract, feature-api-contract-baseline]
created: 2026-05-22
last_reviewed: 2026-05-27
---
# PayPal REST API — Idempotency (PayPal-Request-Id)
> Layer: `raw/official-docs/` — PayPal 공식 REST API 의 idempotency header (`PayPal-Request-Id`) 정의. Stripe `Idempotency-Key` 와 다른 헤더명, 다른 TTL 정책의 비교 reference.
## Parent / 활용 branch (필수)
| Branch | 이 자료가 정당화하는 결정 |
|---|---|
| [[raw/branch-notes/feature-rate-limit-idempotency-contract]] | `(request_id, API call type)` pair scope + 45일 TTL + in-flight "might fail" 모델의 비교 근거 |
| [[raw/branch-notes/feature-api-contract-baseline]] | 헤더명 차이 (vendor 마다 `Idempotency-Key` vs `PayPal-Request-Id` 등) 가 API surface 표준화 결정에 미치는 영향 |
| [[raw/project-notes/ca-skeleton-operational-contract]] | §13. API Contract Surface (Idempotency-Key) + §18. Control Plane Contract — 가장 긴 TTL 사례 reference |
## 컨텍스트
PayPal 의 `PayPal-Request-Id` 는 Stripe `Idempotency-Key` 와 다른 헤더명을 쓰지만 동일 개념. **scope 를 "request × API call type" 으로 정의**한다는 명시가 있어 ca-tmpl triple 과의 비교에 유리. 또한 결제 도메인에서 가장 긴 TTL (45일) 사례.
## 출처 / Source
- 원본 URL: https://developer.paypal.com/api/rest/reference/idempotency/
- 보조 URL: https://developer.paypal.com/api/rest/requests/ (API 요청 가이드)
- 아카이브 URL: (미수집)
- 저자 / 조직: PayPal Holdings, Inc. — Developer Documentation
- 발행일: rolling docs
- 마지막 확인일: 2026-05-27 (WebFetch 성공 — C2, C4, C5 는 verbatim 재확인 완료 → `official-vendor-doc` upgrade. C1 은 fragment 일치 + 후반부 ("to enforce idempotency on REST API POST calls") 미확인. C3 (45일 TTL) 은 페이지 개정으로 **NOT FOUND** — 현재 페이지는 "for a period of time" 만 언급, 45-day 수치 없음 → 계속 `needs-confirmation`)
## 핵심 인용 / Key quotes (verbatim)
> [§Idempotency, 2026-05-22 capture, 2026-05-27 partial verified — "unique user-generated ID that the server stores for a period of time" fragment 일치, 후반부 ("to enforce idempotency on REST API POST calls") 는 WebFetch 응답에 미포함] "The `PayPal-Request-Id` request header contains a unique user-generated ID that the server stores for a period of time to enforce idempotency on REST API POST calls."
> [§Idempotency, 2026-05-22 capture, 2026-05-27 verified verbatim] "The `PayPal-Request-Id` header value must be unique for both each request and an API call type. For example, authorize payment and capture authorized payment."
> needs-confirmation [§Idempotency, 2026-05-22 capture, 2026-05-27 NOT FOUND — 현재 페이지는 "for a period of time" 만 언급, 45-day 수치 없음] "PayPal stores your unique ID for up to 45 days. If you retry a call with the same `PayPal-Request-Id`, PayPal recognizes it as a duplicate and returns the result of the original call."
> [§Idempotency, 2026-05-22 capture, 2026-05-27 verified verbatim] "When you send two simultaneous API requests with same `PayPal-Request-Id` header, PayPal processes the first request and might fail the second request."
> [§Idempotency, 2026-05-22 capture, 2026-05-27 verified verbatim] "You can retry idempotent calls that fail with network timeouts or HTTP `5xx` status codes for as long as the server stores the ID."
> **2026-05-27 재검증 결과**: C2, C4, C5 verbatim 확인 (`official-vendor-doc` upgrade). C1 은 partial (fragment 일치). **C3 (45일 TTL) 은 NOT FOUND** — PayPal 이 페이지를 개정하여 구체 일수를 제거했을 가능성 (현재는 "for a period of time" 만 명시). ca-tmpl 24h TTL vs PayPal 45일 비교 분석을 사용하는 모든 downstream 문서는 PayPal 의 명시적 45-day 수치 출처를 다른 페이지/archive snapshot 으로 보강 필요.
## Claims Extracted / 추출된 주장
| Claim ID | Claim (이 자료가 직접 말하는 것) | Evidence quote | Strength | Applies to | Does not prove |
|---|---|---|---|---|---|
| PAYPAL-IDEMP-C1 | `PayPal-Request-Id` 는 client 가 생성한 unique ID 를 server 가 일정 기간 저장하여 REST API POST 호출의 idempotency 를 강제 | [§Idempotency, 2026-05-22 capture, 2026-05-27 partial verified — fragment 일치] "The `PayPal-Request-Id` request header contains a unique user-generated ID that the server stores for a period of time to enforce idempotency on REST API POST calls." | `needs-confirmation` (partial — fragment "unique user-generated ID that the server stores for a period of time" 만 verbatim 확인, 후반부 미확인) | PayPal REST API POST endpoint | Stripe `Idempotency-Key` 와 100% 동일 동작이라는 뜻은 아님 |
| PAYPAL-IDEMP-C2 | unique 성은 (request, API call type) 두 축 모두에 대해 요구 — authorize payment 과 capture authorized payment 가 별도 idempotency 단위 | [§Idempotency, 2026-05-22 capture, 2026-05-27 verified verbatim] "The `PayPal-Request-Id` header value must be unique for both each request and an API call type. For example, authorize payment and capture authorized payment." | `official-vendor-doc` | PayPal REST API 의 endpoint 간 분리 | 가맹점 (account) dimension 의 명시적 분리는 본 인용에 없음 — API 키 인증으로 implicit |
| PAYPAL-IDEMP-C3 | PayPal 은 unique ID 를 최대 45일까지 저장하며, 동일 ID 로 재시도 시 duplicate 으로 인식하여 original call 의 결과를 반환 | [§Idempotency, 2026-05-22 capture, 2026-05-27 NOT FOUND — 현재 페이지는 "for a period of time" 만 언급] "PayPal stores your unique ID for up to 45 days. If you retry a call with the same `PayPal-Request-Id`, PayPal recognizes it as a duplicate and returns the result of the original call." | `needs-confirmation` | PayPal idempotency store | 45일 수치 자체가 현재 페이지에 부재 — 페이지 개정 가능성, 다른 출처 보강 필요 |
| PAYPAL-IDEMP-C4 | 동일 `PayPal-Request-Id` 로 두 simultaneous request 를 보내면 PayPal 은 first 를 처리하고 second 는 fail 시킬 수 있다 ("might fail") | [§Idempotency, 2026-05-22 capture, 2026-05-27 verified verbatim] "When you send two simultaneous API requests with same `PayPal-Request-Id` header, PayPal processes the first request and might fail the second request." | `official-vendor-doc` | PayPal 의 in-flight 동시 요청 처리 | "might fail" 의 정확한 status code / error 형태는 본 인용에 없음. 항상 fail 한다는 뜻도 아님 (확률적 표현) |
| PAYPAL-IDEMP-C5 | network timeout 또는 5xx 로 실패한 idempotent call 은 server 가 ID 를 저장하는 기간 동안 재시도 가능 | [§Idempotency, 2026-05-22 capture, 2026-05-27 verified verbatim] "You can retry idempotent calls that fail with network timeouts or HTTP `5xx` status codes for as long as the server stores the ID." | `official-vendor-doc` | retry 정책 설계 | 4xx 실패에 대한 재시도 권장 여부는 본 인용 범위 밖 |
| PAYPAL-IDEMP-C6 | same key + different body (fingerprint mismatch) 의 처리 정책은 본 인용 범위 내에 **명시 없음** | (부재 자체가 claim) | `needs-confirmation` | body fingerprint mismatch 처리 | PayPal 이 body diff 를 무시한다는 뜻도, 거부한다는 뜻도 아님. 문서가 직접 다루지 않음 |
## Usage Boundaries / 적용 경계
- **이 자료가 직접 증명하는 것**:
- 2026-05-27 verbatim 확인 완료 (`official-vendor-doc`): `C2` (request × API call type scope), `C4` (simultaneous "might fail"), `C5` (5xx/timeout retry 허용)
- 2026-05-27 partial (fragment 일치): `C1` (header 의 unique user-generated ID 저장 메커니즘)
- 2026-05-27 NOT FOUND: `C3` (45일 TTL — 현재 페이지는 "for a period of time" 만 명시)
- **이 자료가 증명하지 않는 것**:
- `PAYPAL-IDEMP-C6`: same-key + different-body 시 동작 (body fingerprint 정책)
- 가맹점 dimension 의 명시적 분리 (인증으로 implicit 으로 추정)
- "might fail" 의 정확한 status code / 재시도 권장 backoff
- 저장소 backend (외부 관찰 불가)
- **내 프로젝트에 적용하려면 추가 확인이 필요한 것**:
- 2026-05-27 시점 페이지 재확인 (WebFetch 차단으로 본 migration 에서 미실행)
- ca-tmpl 의 `(principal, key, useCaseName)` triple 과 PayPal `(request_id, API call type)` pair 의 mapping (PayPal 은 가맹점 implicit)
- ca-tmpl 24h TTL 결정의 위험 (PayPal 45일 대비 매우 짧음 — 결제 분쟁 윈도우 손실 vs 저장 비용)
- ca-tmpl 200ms wait 동작이 PayPal "might fail" 보다 클라이언트 친화적이라는 해석의 정합성
## ca-tmpl 함의 (내 프로젝트 해석)
> 본 섹션은 자료 직접 인용이 아닌 ca-tmpl 결정 컨텍스트 해석. wiki 추출 시 source-summary 로 옮겨야 함.
- **key scope**: PayPal `(request_id, API call type)` ≈ ca-tmpl `(key, useCaseName)`. **principal dimension 은 PayPal 에선 인증으로 implicit**, ca-tmpl 은 explicit triple 로 박아둠 → ca-tmpl 이 멀티테넌시에서 더 명시적이고 안전.
- **TTL**: PayPal 45일 ≫ ca-tmpl 24h. ca-tmpl 이 훨씬 보수적 (저장 부하 낮음, retry 윈도우 짧음).
- **in-flight**: PayPal "might fail" (`C4`) vs ca-tmpl 200ms wait → ca-tmpl 이 결정적·사용자 친화적 (단, 표준 동작은 아님 — IETF draft 는 409 즉시 권장).
- **fingerprint**: PayPal 미명시 (`C6`) vs ca-tmpl 422 명시 → ca-tmpl 이 더 엄격.
## 메모 / Notes
- **2026-05-27 재검증 완료**: WebFetch 성공. C2/C4/C5 verbatim 일치 → `official-vendor-doc` upgrade. C1 partial. **C3 (45일 TTL) NOT FOUND** — PayPal 이 페이지에서 구체 일수를 제거했을 가능성 (현재는 "for a period of time" 만 명시).
- ca-tmpl 24h TTL vs PayPal 45일 비교 분석을 사용하는 모든 downstream claim 은 PayPal 의 45-day 출처를 다른 페이지/archive snapshot/changelog 으로 보강 필요. C3 인용을 그대로 외부 산출물에 사용 금지.
## Related / 관련
- 같은 주제 다른 raw:
- [[raw/official-docs/idempotency-stripe-api-ref]]
- [[raw/official-docs/idempotency-ietf-draft]]
- [[raw/company-tech-blogs/idempotency-toss-payments-techblog]]
- 인용하는 branch:
- [[raw/branch-notes/feature-rate-limit-idempotency-contract]]
- [[raw/branch-notes/feature-api-contract-baseline]]
- 인용하는 project:
- [[raw/project-notes/ca-skeleton-operational-contract]] (§13, §18)
- 인용한 wiki 요약: (미작성)